java代理模式实例讲解

下面这个是设计模式课上的例子:

 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Method;
 3 import java.lang.reflect.Proxy;
 4 import java.util.List;
 5 import java.util.Vector;
 6
 7
 8 public class VectorProxy implements InvocationHandler {
 9
10     private Object targetObj;
11
12     public Object getObject(){
13         return targetObj;
14     }
15
16     public VectorProxy(Object Obj){
17         targetObj = Obj;
18     }
19
20     public static Object factorary(Object Obj){
21
22         Class cla = Obj.getClass();
23         Object proxy = Proxy.newProxyInstance(cla.getClassLoader(), cla.getInterfaces(), new VectorProxy(Obj));
24         return proxy;
25     }
26
27     public Object invoke(Object proxy, Method method, Object[] args)
28             throws Throwable {
29         System.out.println("befor invoke   "+method.getName());
30         if(args!=null){
31             for(Object o:args){
32                 System.out.println(o.toString());
33             }
34         }
35
36         Object tarObj = ((VectorProxy)(Proxy.getInvocationHandler(proxy))).getObject();
37
38         System.out.println(tarObj==targetObj);
39
40         Object resultObj = method.invoke(targetObj,args);
41
42         return resultObj;
43     }
44
45     public static void main(String args[]){
46         List v = null;
47         v = (List)factorary(new Vector(10));
48         v.add("NEW");
49         System.out.println(v.get(0));
50     }
51
52 }

结果:

befor invoke   add
NEW
true
befor invoke   get
0
true
NEW

我通过这个例子来讲一下我对动态代理的理解。

从main函数入口开始。当我执行了v = (List)factorary(new Vector(10));的时候,这时所做的操作有21~24,我们看23行,这个Proxy.newProxyInstance函数会生成一个代理的实例,但是生成谁的实例呢?我们来看一下这个函数的原型:public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

它生成的是接口InvocationHandler这个接口的实例,在本例中中类VectorProxy实现了这个接口且在23行,传入将这个类传入进去了。这个函数返回实现了被代理类所实现的所有接口的Object对象,即动态代理,需要强制转型。这里可以再看一下47行,对应于这句话(List)就是强制类型转换,类成员变量targetObj就是被代理类,这里是Vector,实现的所有接口则就是Vector的各种操作例如get,add这些。在47行,这个实现了所有Vector接口的Vector对象被赋值给了v。下面就是接口InvocationHandler里的这个invoke函数了,这个函数是自动调用的,29~39都是可以去掉的,有用的只是40行的这个。然后至于40行的这个详细内容可以去我的上篇博客 反射机制的进一步理解 中去看,这里不再赘述。

接下来看一下29~39行的这些对应的输出。这些输出的原理看完反射机制的进一步理解 之后都可以看懂,我就来讲一下37行的这句,先看一下Proxy这个类的成员变量:

如果你在factorary中加上一句 System.out.println("proxy的类型"+proxy.getClass().getName());   然后对应的输出就是 proxy 的类型 $Proxy0,在 Proxy 的类的定义中我们发现它有一个 proxyClassNamePrefix 的东西,这个前缀加上0就是我们这个生成的代理的proxy,所以37行的那个 Object tarObj = ((VectorProxy)(Proxy.getInvocationHandler(proxy))).getObject(); 这儿proxy就是一个标号,然后其实就是那个v就是通过这个标号去进行add,get操作其实v(也就是proxy,接下来用v)并没有实现所有的方法,它只是通过invoke把v的这些操作通过java底层第调用仍然由被代理对象本身的函数去处理了,v所指代的并不是一个新的和之前的targetObj不一样的类,它只是一个指向了那个类的高级标识符,可以对类进行操作而已。合理猜测:Proxy中的两个map成员变量应该是存储多个代理类用的用来存放v(proxy)用的。讲到了这儿已经没有什么可再说的啦。

时间: 2024-11-07 11:12:53

java代理模式实例讲解的相关文章

java 代理模式详解

java 动态代理(JDK和cglib) 设计模式这东东每次看到就明白可过段时间又不能很流利的说出来,今天就用详细的比喻和实例来加深自己的理解(小弟水平不高有不对的地方希望大家能指出来). (1)代理这个词生活中有很多比如在街边卖手机卡.充公交地铁卡的小商店他们都起了代理的作用,java中的代理跟这些小店商的作用是一样的.再比如我想在淘宝上开个服装店但又没有货源怎么办,这时候我就要跟淘宝上某一卖家联系做他的代理.我跟我的商家都要卖衣服(就好比我们都继承了卖衣服的接口sellClothesInte

java代理模式学习

Java动态代理模式 1. 代理:一个角色代表别一个角色来完成某些特定的功能. 比如:生产商,中间商,客户这三者这间的关系 客户买产品并不直接与生产商打交道,也不用知道产品是如何产生的,客户只与中间商打交道,而中间商就可以对产品进行一些包装,提供一些售后的服务. 代理模式有三个角色: 1. 抽象主题角色 2. 代理主题角色 3. 实际被代理角色 其它类通过访问代理主题角色来访问实际被代理角色. 2. 下面我们来个一个静态代理的实现. 我以一个坦克为例. 抽象主题角色:Moveable Java代

Java 代理模式(二) Java中的动态代理

动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类: 1.Interface InvocationHandler 该接口中仅定义了一个方法: Object invoke(Object proxy, Method method, Object[] args) 在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组(无参时设置为null). 这个抽象方法在代理类中动态实现. 2

Java代理模式

Java代理模式分为静态代理和动态代理模式 静态代理模式比较简单,直接上图和代码: 代理模式类图如下: 在代理模式中的角色: ● 抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象. ● 目标对象角色:定义了代理对象所代表的目标对象. ● 代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象:代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象.代理对象通常在客户端调用传递给目标对象之前或之后,执行某个

Java代理模式——静态代理模式

一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计到的角色 抽象角色:声明真是对象和代理对象的共同接口(抽象类或接口). 代理角色:代理对象角色内部含有对真是对象的引用,从而可以操作真是对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真是对象.同时,代理对象可以在执行真实对象的操作时,附加其他操作,相当于对真是对象进行封装. 真实

Java反射、Java代理模式

简单来说,JAVA反射是利用类名称来获得这个类的所有信息:代理,是有个传递过程,将自己的类对象传给其他类,让其他类来代理自己的类对象然后做事: 比喻:订外卖,送餐小哥手里的外卖就是我的对象,是我让他送的.静态代理就是我告诉送餐小哥外卖是我的(假设外卖小哥认识我),然后他直接就奔着我来了:动态代理就是我不告诉送餐小哥我是谁,他也不认识我,我只告诉他我的电话或者地址,他自己想办法找到我:注意,他有什么办法找到我呢?就是反射,他利用我的电话和地址,就知道我的一切了(夸张的说)就可以找到我了. 下面通过

Java 代理模式

代理模式的概念:为其他对象提供一种代理一控制对这个对象的访问. 应用场景:在开发中一些业务类中方法,除了需求的操作,还需要进行其他的非业务操作.比如提供给app的接口.除了接口要实现的业务逻辑,还要对用户的信息,设备的信息进行验证,参数的加密解密.这种在每个接口方法前都要调用的,和业务代码参在一起就会重复,累赘.可以通过代理类将这些经常使用的方法抽取出来.业务类只用关心业务操作,降低耦合. 静态代理 代理和被代理对象在代理前是确定的.他们都实现了相同的接口或者继承了相同的抽象类. 动态代理 动态

Java代理模式汇总

简介 代理模式即Proxy Pattern,23种java常用设计模式之一.其定义为:对其他对象提供一种代理以控制对这个对象的访问. UML类图 静态代理 目标接口 public interface Subject { public void execute(); } 目标实现类 public class RealSubject implements Subject { private String a; public RealSubject(String a) { this.a = a; }

java 代理模式具体解释

java 动态代理(JDK和cglib) 设计模式这东东每次看到就明确可过段时间又不能非常流利的说出来.今天就用具体的比喻和实例来加深自己的理解(小弟水平不高有不正确的地方希望大家能指出来). (1)代理这个词生活中有非常多比方在街边卖手机卡.充公交地铁卡的小商店他们都起了代理的作用,java中的代理跟这些小店商的作用是一样的. 再比方我想在淘宝上开个服装店但又没有货源怎么办,这时候我就要跟淘宝上某一卖家联系做他的代理.我跟我的商家都要卖衣服(就好比我们都继承了卖衣服的接口sellClothes