源码层面学习动态代理

前言

在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可能更合适。

相关推荐
comeilmforever8 分钟前
IDEA2025 Version Control 窗口 local changes显示
java·ide·intellij-idea
火车叨位去19499 分钟前
映射阿里云OSS(对象存储服务)
java·spring
2301_14725836915 分钟前
7月1日作业
java·前端·算法
Ting-yu19 分钟前
Java中Stream流的使用
java·开发语言·windows
一只猿Hou36 分钟前
java分页插件| MyBatis-Plus分页 vs PageHelper分页:全面对比与最佳实践
java·mybatis
程序员弘羽42 分钟前
C++ 第四阶段 内存管理 - 第二节:避免内存泄漏的技巧
java·jvm·c++
旷世奇才李先生1 小时前
Tomcat 安装使用教程
java·tomcat
勤奋的知更鸟1 小时前
Java 编程之策略模式详解
java·设计模式·策略模式
qq_4924484461 小时前
Java 访问HTTP,信任所有证书,解决SSL报错问题
java·http·ssl
爱上语文1 小时前
Redis基础(4):Set类型和SortedSet类型
java·数据库·redis·后端