• JDK动态代理与CGLIB动态代理


    jdk动态代理

    1、必须实现 InvocationHandler 接口
    2、使用 Proxy.newProxyInstance 产生代理对象
    3、被代理的对象必须要实现接口

    用 Proxy.newProxyInstance 产生代理对象利用参数被代理对象的类加载器和被代理对象实现的所有接口生成指定的代理类—>获取代理类的构造函数对象---->根据代理类的构造函数对象来创建需要返回的代理类对象
    返回值:$Proxy0(代理对象):App类运行时,JDK动态构建出来的代理类,继承至Proxy类

    InvocationHandler 的 invoke()
    使用invoke方法对被代理人的方法进行拦截, 为真实对象定制代理逻辑
    *
    第一个参数为 代理对象
    *
    第二个参数为目标类的真实方法
    *
    第三个参数为目标方法参数

    后面两个参数决定调用被代理类的哪个方法

    CGlib动态代理

    CGLIB 通过动态生成一个需要被代理类的子类(即被代理类作为父类),该子类重写被代理类的所有不是 final 修饰的方法,并在子类中采用方法拦截的技术拦截父类所有的方法调用,进而织入横切逻辑
    在底层实现上,CGLIB 使用字节码处理框架 ASM,该框架用于转换字节码并生成新的类

    区别

    JDK 动态代理只能对接口进行代理,不能对普通的类进行代理,这是因为 JDK 动态代理生成的代理类,其父类是 Proxy,且 Java 不支持类的多继承。
    CGLIB 能够代理接口和普通的类,但是被代理的类不能被 final 修饰,且接口中的方法不能使用 final 修饰。
    JDK 动态代理使用 Java 反射技术进行操作,在生成类上更高效。
    CGLIB 使用 ASM 框架直接对字节码进行修改,使用了 FastClass 的特性。在某些情况下,类的方法执行会比较高效。

  • 相关阅读:
    安卓开发-基础知识补习6
    qmake source code 解读
    YOLOv8-seg改进:注意力系列篇 | 一种简单有效的可变形的自注意力模块DAT | CVPR 2022
    List的使用
    【C】自定义类型(二)位段,枚举,联合
    Tomcat部署项目的两种方式
    P4185 [USACO18JAN] MooTube G (并查集 + 离线
    vue3 Driver.js 页面分步引导
    Haskell 函数(包括条件表达式,模式匹配)
    C++项目:高并发内存池
  • 原文地址:https://blog.csdn.net/weixin_45511599/article/details/126281501