jdk动态代理和cglib动态代理的区别

CGLIB代理:

CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。 

CGLIB(CODE GENERLIZE LIBRARY)代理是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明称final的。

如果目标对象实现了接口,可以强制使用CGLIB实现代理。

如果目标对象没有实现接口,则默认会采用CGLIB代理; 

为什么jdk动态代理必须基于接口 
原因如下: 
1、生成的代理类继承了Proxy,由于java是单继承,所以只能实现接口,通过接口实现 

2、从代理模式的设计来说,充分利用了java的多态特性,也符合基于接口编码的规范 

为什么需要接口,先上结论

1.在需要继承proxy类获得有关方法和InvocationHandler构造方法传参的同时,java不能同时继承两个类,我们需要和想要代理的类建立联系,只能实现一个接口

2.需要反射获得代理类的有关参数,必须要通过某个类,反射获取有关方法,如本次测试用的 :printSomeThing

3.成功返回的是object类型,要获取原类,只能继承/实现,或者就是那个代理类

4.对具体实现的方法内部并不关心,这个交给InvocationHandler.invoke那个方法里去处理就好了,我只想根据你给我的接口反射出对我有用的东西。

5.考虑到设计模式,以及proxy编者编写代码的逻辑使然

 

jdk代理和cglib代理的区别:(https://blog.csdn.net/yhl_jxy/article/details/80635012

 

上一篇:JDK代理与CGLib代理区别


下一篇:Spring事务Transactional和动态代理(二)-cglib动态代理