• 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 的特性。在某些情况下,类的方法执行会比较高效。

  • 相关阅读:
    C++ 定义一个计数器类,完成倒计时的功能。
    Debian11系统简单配置
    【ONE·R || R与C++混合编程简单介绍 】
    掌握Python操作Word:从基础到高级全覆盖
    NJU操作系统公开课笔记(1)
    压缩算法---以golang/snappy为例
    杰理之CMD_SET_BLE_VISIBILITY【篇】
    Windows+Opencv+Clion的配置
    总结:常见的服务发布策略
    java面试题-jvm基础知识
  • 原文地址:https://blog.csdn.net/weixin_45511599/article/details/126281501