先来看一下 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, 这个问题待续
来源: http://www.bubuko.com/infodetail-3206218.html