• 反射应用之动态代理


    参考链接: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)服务。如想要为多个接口服务则需要建立很多个代理类。动态代理类通过一个代理类能完成全部的代理功能。
  • 相关阅读:
    贴一段微博上的小知识
    关于编译Qt以及驱动的一点总结吧
    一些服务器客户端的c例子
    android中DatePicker和TimePicker的使用
    Python标准库string模块《未完待续》
    Qt: SQL Programming
    和一个坑爹的项目组的经历
    linux一些杂项整理
    Qt中的QTableWidget
    Linux c学习进程基础学习
  • 原文地址:https://www.cnblogs.com/kelly-one/p/7747795.html
Copyright © 2020-2023  润新知