JDK 动态代理 和 CGLIB 代理的区别
JDK动态代理使用Proxy类和接口来创建代理对象,通过实现。在使用时,需要提供一个实现了接口的处理器,JDK代理会通过这个处理器来调用原始对象的方法。
·
一、JDK动态代理
(1) 底层原理
JDK动态代理使用 Proxy 类和 InvocationHandler 接口来创建代理对象,通过反射机制实现。在使用时,需要提供一个实现了InvocationHandler 接口的处理器,JDK代理会通过这个处理器来调用原始对象的方法。
(2) 实现方式
目标类实现了接口,JDK 动态代理使用 InvocationHandler.invoke() 调用目标对象的方法。
二、CGLIB 动态代理
(1) 底层原理
CGLIB 是一个第三方代码生成库,基于 ASM 字节码操作框架,通过继承的方式实现代理。CGLIB 通过继承生成目标类的子类代理,使用 MethodInterceptor 拦截方法。
(2) 实现方式
继承目标类的方式 动态生成子类,CGLIB 代理的实现依赖于 Enhancer 类和 MethodInterceptor 接口,直接修改字节码。
三、两者区别
| 对比项 | JDK 动态代理 | CGLIB 动态代理 |
|---|---|---|
| 代理方式 | 基于接口实现 | 继承目标类 |
| 底层原理 | 反射 + Proxy.newProxyInstance() |
ASM 字节码增强 |
| 性能 | 较慢(反射调用) | 较快(直接调用父类方法) |
| 是否需要接口 | 是,必须有接口 | 否,可代理普通类 |
| 拦截方式 | InvocationHandler |
MethodInterceptor |
更多推荐



所有评论(0)