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 }
  • 相关阅读:
    JS事件冒泡、事件捕获和事件委托
    实现英文字母排序
    JavaScript异步加载的四种方法
    JavaScript作用域与作用域链
    JavaScript 自定义属性 data-*
    asycn和await
    style collectd
    JavaScript如何比较两个数组的内容是否相同
    VScode插件开发--M2D文档转换插件
    BOM笔记
  • 原文地址:https://www.cnblogs.com/zhangfan94/p/4273244.html
Copyright © 2011-2022 走看看