`

Java proxy

 
阅读更多

原写于2010-12-12

 

一.摘要

1.什么是“代理”

2.代理模式与适配器模式、装饰者模式的区别,适用场景

3.手工代理

4.动态代理的原理

 

二.什么是“代理”

如:一个CEO,会有一个助理,任何需要CEO处理的事情,都会经过助理过滤、整理后交给CEO。助理就是CEO的代理。

自己理解,代理就是为帮实际的执行者,做数据的过滤和控制,为实际执行者屏蔽掉外部其它因素的影响,专心去做应该做的事情。

 

三.代理模式与适配器模式、装饰者模式的区别,适用场景

1.代理模式

HeadFirst 定义:为另一个对象提供一个替身或占位符以控制对这个对象的访问。


如上图,代理模式的结构。

适用的场景,如:远程访问、访问权限控制、日志记录等。

 

2.装饰者模式,IO类图结构如下:

可以从OutputStream à FileOutputStream à BufferedOutputStream,功能依次增强,为对象增加更多的行为。

自己理解:目的不一样,代理是为控制对被代理对象的访问;装饰者,是对被装饰者功能的增强,避免过度使用继承实现不同的功能。

 

3.适配器模式,其区别从类图即可分辨出来,如下 :


Client请求ExecuteClass,但ExecuteClass暴露的接口不符合client的要求,在双方系统都不修改的情况下,利用适配器模式解决此问题。

 

三、手工代理

场景:根据id,获取Item;代理检查用户的权限是否有权限查看Item,已经记录log日志。

 

 

四、动态代理

对上面的场景,如果使用动态代理,步骤:

1. 根据interface,通过loader,生成Class对象

Class clazz = Proxy.getProxyClass(ItemService.class.getClassLoader(), ItemService.class);

2. 通过反射,获取Class对象的Construct对象(注意:Construct对象需要的参数类型)

Constructor c = clazz.getConstructor(InvocationHandler.class);

3. 调用Construct对象 newInstance()生成实例对象

proxy = (ItemService)c.newInstance(this); //this是InvocationHandler实例

 

思考问题:实现原理是什么

对于上面场景,实际动态生成的代理的类图。对代理的任何调用都会,super.handle.invoke(),用户实现InvocationHandler,覆写invoke方法,实现基于方法的控制。

从类图,也解释了为什么只能实现“接口”的动态代理,因为代理本身需要继承Proxy,如果实现“类”的代理,意味着要同时继承两个类,与Java不支持多继承相违背。

写道
下面的代码是从网上摘抄过来的,动态生成的代理的源码:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
public final class $Proxy0 extends Proxy implements Manager {
private static Method m1;
private static Method m0;
private static Method m3;
private static Method m2;

static {
   try {
    m1 = Class.forName("java.lang.Object").getMethod("equals",
      new Class[] { Class.forName("java.lang.Object") });
    m0 = Class.forName("java.lang.Object").getMethod("hashCode",
      new Class[0]);
    m3 = Class.forName("com.ml.test.Manager").getMethod("modify",
      new Class[0]);
    m2 = Class.forName("java.lang.Object").getMethod("toString",
      new Class[0]);
   } catch (NoSuchMethodException nosuchmethodexception) {
    throw new NoSuchMethodError(nosuchmethodexception.getMessage());
   } catch (ClassNotFoundException classnotfoundexception) {
    throw new NoClassDefFoundError(classnotfoundexception.getMessage());
   }
}

public $Proxy0(InvocationHandler invocationhandler) {
   super(invocationhandler);
}
@Override
public final boolean equals(Object obj) {
   try {
    return ((Boolean) super.h.invoke(this, m1, new Object[] { obj }))
      .booleanValue();
   } catch (Throwable throwable) {
    throw new UndeclaredThrowableException(throwable);
   }
}
@Override
public final int hashCode() {
   try {
    return ((Integer) super.h.invoke(this, m0, null)).intValue();
   } catch (Throwable throwable) {
    throw new UndeclaredThrowableException(throwable);
   }
}
}

 

  • 大小: 10.5 KB
  • 大小: 19.4 KB
  • 大小: 24.4 KB
  • 大小: 26.4 KB
  • 大小: 29.4 KB
分享到:
评论

相关推荐

    java proxy demo 代理类的运用demo

    在这个“java proxy demo”中,我们将深入探讨如何利用Sun JDK API来创建和使用Java动态代理。 首先,我们要了解Java代理的基本概念。Java代理分为静态代理和动态代理两种。静态代理是在编译时就已经确定代理类的...

    Java_ProxyServer.rar_Java ProxyServer_java proxy server

    Java ProxyServer是一个基于Java实现的代理服务器类,它在客户端和服务器之间起到了中继的作用,允许数据在两者间传输。代理服务器在计算机网络中的主要功能是提供代理服务,它可以隐藏客户端的真实身份,增加网络...

    java proxy

    Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理可以在运行时创建一个实现一组给定接口的新类,而无需知道实际的目标对象。代理类是在运行时动态...

    java Proxy 动态代理

    在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类是用于创建一个代理对象,而InvocationHandler接口则定义了代理对象调用方法时的行为。 1. **...

    深入理解Java Proxy机制.doc

    Java的Proxy机制是Java反射API的一部分,主要用于创建动态代理类和动态代理对象。它允许我们在运行时创建一个实现了特定接口的新类,这个新类的行为由我们提供的InvocationHandler对象控制。以下是对Java Proxy机制...

    深入理解JavaProxy机制.doc

    Java Proxy 机制是Java语言提供的一种动态代理功能,允许我们在运行时创建一个新的类,这个类可以实现一组指定的接口,并且在方法调用时插入自定义的行为。这主要通过`java.lang.reflect.Proxy`类和`java.lang....

    从房屋买卖看 java proxy 模式

    标题中的“从房屋买卖看 java proxy 模式”暗示了我们将通过一个具体的场景来探讨 Java 中的代理(Proxy)模式。在软件设计中,代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在...

    JavaProxy Demo

    在标题“JavaProxy Demo”中提到的,这是一个展示Java动态代理功能的示例程序。动态代理通常用于实现AOP(面向切面编程)或者在不修改目标对象的情况下增加额外的功能,比如日志、事务管理、性能监控等。 在Java中...

    java 实现HTTP PROXY

    Java实现HTTP PROXY是一个常见的需求,特别是在开发网络应用或者测试环境中,我们可能需要通过代理服务器转发HTTP请求。本文将深入探讨如何使用Java编程语言来创建一个HTTP代理服务器,并且会涉及相关的源码分析。 ...

    Java Proxy机制详细解读

    Java Proxy机制详细解读 Java Proxy机制是Java语言中的一种设计模式,主要用于将对象的调用行为与实现解耦,提供了一个代理对象,使得外界无法直接访问目标对象,从而提高了系统的灵活性和可维护性。 Proxy机制的...

    proxy.jsp、proxy.ashx、proxy.php、proxy.config

    **proxy.jsp** 是一个用Java编写的代理页面,适用于Java服务器环境,如Tomcat。它通过设置`esri.config.defaults.io.proxyUrl`来指定代理服务的URL,当ArcGIS JavaScript API请求需要跨域访问的资源时,会自动通过这...

    A Java proxy for MS SQL Server Reporting Services

    NULL 博文链接:https://lgr310-163-com.iteye.com/blog/686040

    java_proxy_end

    1. **Java Proxy Class**: Java的`java.lang.reflect.Proxy`类是动态代理的基石。它允许我们在运行时创建一个新的类,这个类可以作为其他接口的实现,这样我们就可以在调用接口方法时插入自定义的行为。在这个`java_...

    proxy.rar java三种代理模式源码

    在Java中,我们可以使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。`Proxy`类用于创建代理对象,`InvocationHandler`接口定义了代理对象方法调用的处理逻辑。在"DynamicProxy...

    java实现Proxy例子

    我自己用eclipse写的java代码,可以直接用eclipse导入,也可以直接用java -jar proxy_sample.jar执行 代码量很小,尽量通过注释进行说明 本例实现了InvocationHandler接口,代码具有典型性 在研究代理模式(Proxy...

    Webscarab java proxy

    一个用来分析使用HTTP和HTTPS协议的应用程序框架 它的原理很简单,WebScarab记录它检测到的会话内容(请求和应答),使用者可以通过多种形式来查看记录。...也可以用它来调试程序中较难处理的 bug,也可以帮助安全...

    JAVA 通过proxy代理方式访问internet资源

    JAVA 通过proxy代理方式访问internet资源,

    java实现免费代理IP的获取方式 并实时校验代理IP是否有效

    Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup的Jar包(Jsoup是加工过的,含请求),有2个主入口程序: 其一:用于请求代理IP,并立即校验是否是一个有效的代理IP,如果有效,...

    JdkProxy.java

    JdkProxy.java

Global site tag (gtag.js) - Google Analytics