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. 前置增强逻辑+目标方法逻辑+后置增强逻辑
*/
原文地址:https://www.cnblogs.com/wangxuejian/p/13290364.html