zoukankan      html  css  js  c++  java
  • 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 aop操作,这是第三个结论

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

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

  • 相关阅读:
    BZOJ 1218: [HNOI2003]激光炸弹( 前缀和 + 枚举 )
    BZOJ 1878: [SDOI2009]HH的项链( BIT )
    BZOJ 1054: [HAOI2008]移动玩具( BFS )
    js-提取行间元素
    vim的三种模式的基本操作
    Linux的高级命令
    Linux的进阶命令
    Linux的基本命令
    Linux常见的文件目录结构
    js-操作属性
  • 原文地址:https://www.cnblogs.com/silyvin/p/11558909.html
Copyright © 2011-2022 走看看