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动态代理为什么要接口

那么为什么要继承Proxy类呢?

因为Proxy内部维护一个InvocationHandler对象进行invoke操作,这是第三个结论

 

 

而cglib使用asm更直接,直接修改字节码进行增强子类,故被代理类不能是final的,这是第四个结论

 

 

那么为什么不能由Proxy生成代理类的字节码,在代理类中定义一个变量并传入InvocationHandler对象的引用,而非继承Proxy呢?目前是调用父类的构造函数并使用子类传给父类的InvocationHandler来调用invoke,这个问题待续

上一篇:63.异常的处理方式之一:捕获异常


下一篇:(转)轻松学,Java 中的代理模式及动态代理