jdk动态代理与cglib优势劣势以及jdk动态代理为什么要interface
先来看一下jdk动态代理原型:
IUserDao target = new UserDao();
// 给目标对象,创建代理对象
IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
// 执行方法 【代理对象】
proxy.save();
第一个结论:其本质与cglib同,都是生成一个子类来模拟“代理”
但是:
动态代理实际上是程序在运行中,根据被代理的接口来动态生成代理类的class文件,并加载class文件运行的过程,通过反编译被生成的$Proxy0.class文件发现:
class类定义为:
public final class $Proxy0 extends Proxy implements Interface {
public $Proxy0(InvocationHandler paramInvocationHandler) {
super(paramInvocationHandler);
}
由于这个子类要继承Proxy类获得有关方法,而java是单继承的,那么就不能再继承被代理类了,这是第二个结论:jdk动态代理为什么要接口
https://juejin.cn/post/7222804347830222909,这篇文章跟我观点一致
了解了这个调用过程,就理解了为什么JDK动态代理必须要基于接口,因为动态生成的代理类已经继承了类java.lang.reflect.Proxy,
而Java又是单继承的,如果想要继续对类进行扩展,只能通过实现接口的方式。
那么为什么要继承Proxy类呢?
因为Proxy内部维护一个InvocationHandler对象进行invoke aop操作,这是第三个结论
而cglib使用asm更直接,直接修改字节码进行增强子类,故被代理类不能是final的,这是第四个结论
那么为什么不能由Proxy生成代理类的字节码,在代理类中定义一个变量并传入InvocationHandler对象的引用,而非继承Proxy呢?目前是调用父类的构造函数并使用子类传给父类的InvocationHandler来调用invoke,这个问题待续

浙公网安备 33010602011771号