zoukankan      html  css  js  c++  java
  • 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. 前置增强逻辑+目标方法逻辑+后置增强逻辑
    */
  • 相关阅读:
    获取程序Appdelegate中无需释放的特定控制器,非新建-------IOS
    IOS传值---属性传值、代理委托传值(delegate)传值、单例传值、block传值
    Tableview最后一行无法显示或者显示不全的问题IOS
    IOS中的懒加载lazyLoad
    IOS中NSUserDefaults的用法(轻量级本地数据存储)
    NSNotification与NSNotificationCenter
    洛谷2756 飞行员配对方案问题
    bzoj4551 [HEOI2016]树
    洛谷2114 bzoj3668[NOI2014]起床困难综合症
    洛谷1345 [Usaco5.4]奶牛的电信
  • 原文地址:https://www.cnblogs.com/wangxuejian/p/13290364.html
Copyright © 2011-2022 走看看