zoukankan      html  css  js  c++  java
  • 反射应用之动态代理

    参考链接:http://blog.csdn.net/hejingyuan6/article/details/36203505

    动态代理与静态代理的区别

    静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了(先编译生成.class字节码文件,然后在jvm中运行.class文件)。

    动态:在程序运行时运用反射机制动态创建而成(不在编译时确定代理类,而是运行时根据你被代理的类是什么,给你动态的创建)。

    代码示例:

       //动态代理的使用
    interface Subject{
    void action();//默认为public abstract
    }
    class RealSubject implements Subject{
    @Override
    public void action() {
    System.out.println("我是被代理类,我将被执行");
    }
    }

    class MyInvocationHandler implements InvocationHandler{

    Object obj;//实现了接口的被代理类的对象的声明(“因为代理类是动态实现的”)
    //定义一个方法用于给“被代理类的对象实例化”和“返回一个代理类的对象”
    public Object blind(Object obj){
    this.obj=obj;
    //看看你(被代理类)实现了哪些接口,实现了哪些类,this:实现了InvocationHandler接口的实现类的对象
    return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
    }

    //当通过代理类的对象发起对被重写的方法的调用时,都会转化为对如下的invoke()方法的调用
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    //method方法的返回值是returnVal
    Object returnVal=method.invoke(obj,args);
    return returnVal;
    }
    }

    public class TestProxy {
    public static void main(String[] args) {
    //1、被代理类的对象
    RealSubject real=new RealSubject();
    //2、创建一个实现了InvocationHandler接口类的对象
    MyInvocationHandler handler=new MyInvocationHandler();
    //调用blind()方法,动态的返回一个同样实现了real所在类(被代理类)实现接口的Subject的代理类的对象
    Object blind = handler.blind(real);//把要动态创建的类传进去,用于动态生成代理类
    Subject sub=(Subject) blind;//此时的sub就是代理类的对象,即转化为“为哪个被代理类”服务(代理类)
    sub.action();//转到对InvocationHandler接口的实现类的invoke()方法的调用
    }
    }

    总结:静态代理类只能为特定的接口(Service)服务。如想要为多个接口服务则需要建立很多个代理类。动态代理类通过一个代理类能完成全部的代理功能。
  • 相关阅读:
    [CareerCup] 11.6 Search a 2D Matrix 搜索一个二维矩阵
    [CareerCup] 11.5 Search Array with Empty Strings 搜索含有空字符串的数组
    [CareerCup] 11.4 Sort the File 文件排序
    [CareerCup] 11.3 Search in Rotated Sorted Array 在旋转有序矩阵中搜索
    VTK 6.3.0 Qt 5.4 MinGW 4.9.1 Configuration 配置
    [CareerCup] 11.2 Sort Anagrams Array 异位词数组排序
    [CareerCup] 11.1 Merge Arrays 合并数组
    Matlab Delete Row or Col 删除矩阵的行或列
    [CareerCup] 10.7 Simplified Search Engine 简单的搜索引擎
    [LeetCode] Nim Game 尼姆游戏
  • 原文地址:https://www.cnblogs.com/kelly-one/p/7747795.html
Copyright © 2011-2022 走看看