先来看一下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动态代理为什么要接口
那么为什么要继承Proxy类呢?
因为Proxy内部维护一个InvocationHandler对象进行invoke操作,这是第三个结论
而cglib使用asm更直接,直接修改字节码进行增强子类,故被代理类不能是final的,这是第四个结论
那么为什么不能由Proxy生成代理类的字节码,在代理类中定义一个变量并传入InvocationHandler对象的引用,而非继承Proxy呢?目前是调用父类的构造函数并使用子类传给父类的InvocationHandler来调用invoke,这个问题待续