zoukankan      html  css  js  c++  java
  • JAVA学习--反射之动态代理模式

     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 }
  • 相关阅读:
    启用div作为编辑器 添加contentEditalbe属性
    AngularJs 通过 ocLazyLoad 实现动态(懒)加载模块和依赖-转
    angularjs的懒加载
    JavaScript 中的this指向问题
    Project Euler:Problem 41 Pandigital prime
    Android 消息机制
    新西兰天维网登录发送明文password
    使用Reveal来查看别人的APP界面+白苹果不刷机解决方式
    Android中List循环遍历性能对照
    2016年最新苹果开发人员账号注冊申请流程最强具体解释!
  • 原文地址:https://www.cnblogs.com/zhangfan94/p/4273244.html
Copyright © 2011-2022 走看看