JDK 动态代理和 CGLib 动态代理区别
1. 代理方式
-
JDK 动态代理:
- 只支持接口代理。它通过反射机制生成一个实现了指定接口的代理类。
- 代理对象只能调用接口中定义的方法。
-
CGLib 动态代理:
- 通过继承方式生成代理类。它可以代理没有实现接口的类。
- 代理对象可以调用类中的所有方法(除了
final
方法)。
2. 性能
-
JDK 动态代理:
- 由于是基于接口的代理,相对简单,性能较好。
-
CGLib 动态代理:
- 由于需要生成一个子类,性能相对较低,但在许多情况下仍然足够快。
3. 使用场景
-
JDK 动态代理:
- 适用于需要代理接口的场景,特别是在 Spring AOP 中,通常使用 JDK 动态代理来处理接口。
-
CGLib 动态代理:
- 适用于需要代理具体类的场景,尤其是在类没有实现接口时。CGLib 也常用于需要对类进行增强的情况。
4. 代理对象的创建
-
JDK 动态代理:
- 使用
java.lang.reflect.Proxy
类创建代理对象。
MyInterface proxy = (MyInterface) Proxy.newProxyInstance( MyInterface.class.getClassLoader(), new Class<?>[]{MyInterface.class}, new MyInvocationHandler(realObject) ); - 使用
-
CGLib 动态代理:
- 使用
net.sf.cglib.proxy.Enhancer
类创建代理对象。
Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(MyClass.class); enhancer.setCallback(new MyMethodInterceptor()); MyClass proxy = (MyClass) enhancer.create(); - 使用
5. 代理类的生成
-
JDK 动态代理:
- 生成的代理类在运行时创建,内存占用相对较小。
-
CGLib 动态代理:
- 生成的代理类是一个子类,可能会占用更多内存。
6. 总结
-
JDK 动态代理:
- 通过反射实现、只支持接口代理、代理对象只能调用接口中定义的方法
- 性能较好
- 使用
java.lang.reflect.Proxy
类创建代理对象 - 内存占用相对较小
-
CGLib 动态代理:
- 通过继承实现、可以代理没有实现接口的类、代理对象可以调用类中的所有方法(除了
final
方法) - 性能相对较低
- 使用
net.sf.cglib.proxy.Enhancer
类创建代理对象 - 可能会占用更多内存
- 通过继承实现、可以代理没有实现接口的类、代理对象可以调用类中的所有方法(除了
参考:ChatGPT
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2023-09-07 VB 发起 Content-Type 为 application/json 的 POST 请求(带请求体)
2021-09-07 GitHub desktop 下载慢