CGLib 和 JDK 动态代理对比
1.JDK 动态代理是实现了被代理对象的接口,CGLib 是继承了被代理对象。
2.JDK 和 CGLib 都是在运行期生成字节码,JDK 是直接写 Class 字节码,CGLib 使用 ASM
框架写 Class 字节码,Cglib 代理实现更复杂,生成代理类比 JDK 效率低。
3.JDK 调用代理方法,是通过反射机制调用,CGLib 是通过 FastClass 机制直接调用方法,
CGLib 执行效率更高
4.cglib实现是实现MethodInterceptor接口的intercept方法 jdk是实现InvocationHandler
接口的invoke方法
JDK Proxy
我们都知道 JDK Proxy 采用字节重组,重新生的对象来替代原始的对象以达到动态代理
的目的。JDK Proxy 生成对象的步骤如下:
1、拿到被代理对象的引用,并且获取到它的所有的接口,反射获取。
2、JDK Proxy 类重新生成一个新的类、同时新的类要实现被代理类所有实现的所有的接口。
3、动态生成 Java 代码,把新加的业务逻辑方法由一定的逻辑代码去调用(在代码中体现)。
4、编译新生成的 Java 代码.class 生成$Proxy0.class
5、再重新加载到 JVM 中运行。
我们发现$Proxy0 继承了 Proxy 类,同时还实现了我们的 Person(代理对象的接口) 接口,而且重写了
findLove()(接口中的方法)等方法。而且在静态块中用反射查找到了目标对象的所有方法,而且保存了所
有方法的引用,在重写的方法用反