源码层面学习动态代理

前言

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

相关推荐
执笔画流年呀24 分钟前
7大排序算法
java·算法·排序算法
AI成长日志29 分钟前
【算法学习专栏】动态规划基础·中等两题精讲(198.打家劫舍、322.零钱兑换)
学习·算法·动态规划
zdl6861 小时前
springboot+全局异常处理
java·spring boot·spring
2301_771717211 小时前
Jackson的使用方法详解
java·服务器·前端
arvin_xiaoting1 小时前
OpenClaw学习总结_III_自动化系统_1:Hooks详解
运维·学习·自动化
立莹Sir2 小时前
Spring Bean生命周期设计思想与源码深度剖析:从表象到本质的全面升级
java·spring·rpc
计算机毕业论文辅导2 小时前
毕业设计避坑指南:工资信息管理系统的设计与实现(Java+SpringBoot实战)
java·spring boot·课程设计
你不是我我2 小时前
【Java 开发日记】为什么要有 time _wait 状态,服务端这个状态过多是什么原因?
java·网络·php
User_芊芊君子2 小时前
别再乱用 ArrayList 了!这 4 个隐藏坑,90% 的 Java 开发者都踩过
android·java·数据库
xcLeigh2 小时前
JAVA项目实战:用飞算 JavaAI 高效开发电商系统核心功能模块
java·ai编程·电商系统·java开发·飞算javaai炫技赛