源码层面学习动态代理

前言

在Java中,动态代理主要分为CGLIB动态代理和JDK动态代理,我们从Hutool的源码也可一窥这两者的使用方式和区别;

CGLIB动态代理

JDK动态代理

使用场景

CglibInterceptorJdkInterceptor都是Hutool提供的代理工具,用于在运行时动态地创建对象的代理,以拦截方法调用。它们的主要区别在于代理机制的实现方式和使用场景:

  1. 实现方式

    • CglibInterceptor:基于CGLIB库实现,通过字节码技术动态生成目标类的子类,并在子类中重写方法来实现拦截。这种方式可以代理没有实现接口的类。
    • JdkInterceptor :基于Java原生的java.lang.reflect.Proxy类实现,只能代理实现了接口的类。通过实现InvocationHandler接口,在invoke方法中定义拦截逻辑。
  2. 使用场景

    • CglibInterceptor:适用于需要代理没有实现接口的类的情况。由于CGLIB可以创建目标类的子类,因此可以对类中的所有方法进行拦截,包括私有方法(通过桥接方法)。
    • JdkInterceptor:适用于代理实现了接口的类。由于Java原生代理的限制,只能拦截接口中声明的方法。
  3. 性能

    • CGLIB由于需要进行字节码操作,创建代理对象的开销可能会比JDK原生代理稍大一些。但在方法调用层面,CGLIB可以提供与目标对象相似的性能。
    • JDK原生代理在创建代理对象时开销较小,但在方法调用时,由于需要通过反射机制,可能会有一定的性能损失。
  4. 功能

    • CGLIB提供了一些额外的功能,比如可以处理final方法的拦截(通过FastClass机制)。
    • JDK原生代理则依赖于Java反射API提供的功能。
  5. 兼容性

    • CGLIB可以代理任何类,包括final类和方法,但可能会有一些限制,比如不能代理被标记为final的类。
    • JDK原生代理只能代理实现了接口的类,不能代理final类。

选择使用CglibInterceptor还是JdkInterceptor,通常取决于具体的使用场景和需求。如果需要代理的类没有实现接口,或者需要拦截类中的所有方法(包括私有方法),则CglibInterceptor可能是更好的选择。如果代理的类已经实现了接口,并且对性能有较高要求,那么JdkInterceptor可能更合适。

相关推荐
NE_STOP8 小时前
Vide Coding--AI编程工具的选择
java
通信小呆呆8 小时前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
码云数智-园园8 小时前
C++20 Modules 模块详解
java·开发语言·spring
程序员黑豆8 小时前
JDK 下载安装与配置详细教程
java·前端·ai编程
H__Rick8 小时前
自动对焦学习-3
人工智能·学习·计算机视觉
Daisy Lee8 小时前
量化学习-第1章-什么是量化金融
学习·金融·datawhale
小宇宙Zz8 小时前
Maven依赖冲突
java·服务器·maven
swordbob8 小时前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
咖啡八杯9 小时前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
十五喵源码网9 小时前
基于springboot2+vue2的租房管理系统
java·毕业设计·springboot·论文笔记