• 2种运行时织入的动态代理模式原理和调用流程比较


    1. 市面上比较常见的两种运行时动态代理是: 基于实现的JDK动态代理  和  基于继承的CGLIB动态代理

    2. 说JDK动态代理是基于实现的,是因为人家开创者是这么设计的,不是因为非要这么做,即: 人家在设计的时候不是基于类来获取被代理的方法,而是基于实现的接口来获取被代理的方法实例.原因如下:

    m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
    m3 = Class.forName("com.xuejian.动态代理使用.IUser").getMethod("see", Class.forName("java.lang.String"));
    m2 = Class.forName("java.lang.Object").getMethod("toString");
    m4 = Class.forName("com.xuejian.动态代理使用.IPerson").getMethod("speak", Class.forName("java.lang.String"));
    m0 = Class.forName("java.lang.Object").getMethod("hashCode");

    m3和m4方法都是基于接口获取的,而不是基于类获取的,所以JDK动态代理离不了接口是因为这个原因,其实在我看来,用目标类本身通过反射完全可以获取到它的全部方法对象.

    3. 说CGLIB动态代理是基于继承的,也是因为人家是这么设计的,当然这样设计肯定是为代码性能或相关扩展性或解耦性考虑的.

    4. 原理和调用链比较:

    /**
    * cglib动态代理的使用步骤:
    * 1. 创建一个Enhancer对象-->Enhancer
    * 2. 设置父类实例(其实就是被代理的那个类的实例)-->目标类
    * 3. 设置回调实例(其实就是封装了增强逻辑的类实例)-->MethodIntercepter
    * 4. 通过Enhancer对象的create方法获取代理类实例
    * 5. 调用代理类实例的相应方法
    *
    * cglib调用流程:
    * 1. 代理类实例调用目标方法
    * 2. 代理类持有的methodIntercepter调用intercept方法
    * 3. 前置增强逻辑+目标方法逻辑+后置增强逻辑
    */

    /**
    * JDK动态代理的使用步骤:
    * 1. 创建一个InvocationHandler实现类的实例(其实就是封装了增强逻辑的类实例)
    * 2. 设置目标实例(其实就是被代理的那个类的实例)
    * 3. 通过Proxy的静态方法newProxyInstance获取代理类实例
    * 4. 调用代理类实例的相应方法
    *
    * JDK调用流程:
    * 1. 代理类实例调用目标方法
    * 2. 代理类持有的InvocationHandler调用invoke方法
    * 3. 前置增强逻辑+目标方法逻辑+后置增强逻辑
    */
  • 相关阅读:
    webdriver css选取器
    LoadRunner录制下载文件
    LoadRunner结果分析笔记
    LR数据收集分析 Analysis 笔记2。
    Analysis 图的设置与操作。
    LR数据收集分析 Analysis 笔记1。
    unittest学习
    LR几个常用函数
    WebService 测试,参数本身就是XML
    在FlashBulider上安装Android开发环境
  • 原文地址:https://www.cnblogs.com/wangxuejian/p/13290364.html
Copyright © 2020-2023  润新知