码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA学习--反射之动态代理模式

时间:2015-02-04 21:45:00      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Method;
 3 import java.lang.reflect.Proxy;
 4 
 5 //动态代理的使用,体会反射是动态语言的关键
 6 interface Subject {
 7     void action();
 8 }
 9 
10 // 被代理类
11 class RealSubject implements Subject {
12     public void action() {
13         System.out.println("我是被代理类,记得要执行我哦!么么~~");
14     }
15 }
16 
17 class MyInvocationHandler implements InvocationHandler {
18     Object obj;// 实现了接口的被代理类的对象的声明
19 
20     // ①给被代理的对象实例化②返回一个代理类的对象
21     public Object blind(Object obj) {
22         this.obj = obj;
23         return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
24                 .getClass().getInterfaces(), this);
25     }
26     //当通过代理类的对象发起对被重写的方法的调用时,都会转换为对如下的invoke方法的调用
27     @Override
28     public Object invoke(Object proxy, Method method, Object[] args)
29             throws Throwable {
30         //method方法的返回值时returnVal
31         Object returnVal = method.invoke(obj, args);
32         return returnVal;
33     }
34 
35 }
36 
37 public class TestProxy {
38     public static void main(String[] args) {
39         
40         //1.被代理类的对象
41         RealSubject real = new RealSubject();
42         //2.创建一个实现了InvacationHandler接口的类的对象
43         MyInvocationHandler handler = new MyInvocationHandler();
44         //3.调用blind()方法,动态的返回一个同样实现了real所在类实现的接口Subject的代理类的对象。
45         Object obj = handler.blind(real);
46         Subject sub = (Subject)obj;//此时sub就是代理类的对象
47         
48         sub.action();//转到对InvacationHandler接口的实现类的invoke()方法的调用
49         
50         //再举一例
51         NikeClothFactory nike = new NikeClothFactory();
52         ClothFactory proxyCloth = (ClothFactory)handler.blind(nike);//proxyCloth即为代理类的对象
53         proxyCloth.productCloth();
54         
55         
56         
57     }
58 }

 

JAVA学习--反射之动态代理模式

标签:

原文地址:http://www.cnblogs.com/zhangfan94/p/4273244.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!