当前位置: 首页 > news >正文

【Java学习】动态代理有哪些形式?

Java动态代理的两种主要形式

动态代理在Java中有两种主要的实现方式,它们各有特点和使用场景:

1. JDK动态代理 (基于接口)

特点

  • Java标准库自带的功能(java.lang.reflect.Proxy
  • 只能代理接口,不能代理普通类
  • 运行时动态生成代理类
  • 性能较好

使用场景

  • 当你的类已经实现了接口时
  • Spring AOP默认使用这种方式

示例代码

// 接口
interface UserService {void saveUser();
}// 实现类
class UserServiceImpl implements UserService {public void saveUser() {System.out.println("保存用户");}
}// 创建代理
UserService proxy = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(),new Class[]{UserService.class},(proxyObj, method, args) -> {System.out.println("前置处理");Object result = method.invoke(new UserServiceImpl(), args);System.out.println("后置处理");return result;}
);proxy.saveUser();

2. CGLIB动态代理 (基于继承)

特点

  • 需要引入第三方库(cglib)
  • 可以代理普通类,不要求有接口
  • 通过继承目标类并重写方法实现代理
  • 生成速度比JDK代理稍慢,但执行效率高

使用场景

  • 当要代理的类没有实现接口时
  • Spring AOP当目标类没有接口时自动使用CGLIB

示例代码

// 普通类(没有接口)
class ProductService {public void addProduct() {System.out.println("添加产品");}
}// 创建代理
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(ProductService.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> {System.out.println("前置处理");Object result = proxy.invokeSuper(obj, args);System.out.println("后置处理");return result;
});ProductService proxy = (ProductService) enhancer.create();
proxy.addProduct();

两种方式的对比

特性JDK动态代理CGLIB动态代理
实现方式基于接口基于继承
是否需要接口必须不需要
性能生成快,调用稍慢生成慢,调用快
限制只能代理接口方法不能代理final类/方法
依赖Java内置需要第三方库

如何选择?

  1. 如果目标对象有接口,优先用JDK动态代理(Spring默认策略)
  2. 如果目标对象没有接口,只能用CGLIB
  3. 对性能要求极高时,可以考虑CGLIB
  4. 需要代理final方法时,只能用JDK动态代理

现代框架如Spring会根据情况自动选择最合适的代理方式。

http://www.xdnf.cn/news/213751.html

相关文章:

  • Windows服务管理
  • Electron-vite中ELECTRON_RENDERER_URL环境变量如何被设置的
  • 偶然发现Git文件夹非常大,使用BGF来处理Git历史Blob文件
  • Python类的力量:第一篇:数据组织革命——用类替代“临时数据结构”
  • Latex全面汇总
  • 感受野(​​Receptive Field​​)
  • 使用高德MCP+AI编程工具打造一个旅游小助手
  • 【MuJoCo仿真】开源SO100机械臂导入到仿真环境
  • 多模态大语言模型arxiv论文略读(四十八)
  • 使用Docker操作MySQL
  • 从零搭建体育比分网站:技术选型与API调用实战(附完整源码)
  • Java中final关键字的作用?
  • Jupyter notebook快捷键
  • 【运维】掌控系统脉搏:用 Python 和 psutil打造高效运维监控工具
  • Qt的WindowFlags窗口怎么选?
  • 第六章 QT基础:7、Qt中多线程的使用
  • Knife4j 接口文档添加登录验证流程分析
  • 天能资管(SkyAi):全球布局,领航资管新纪元
  • 单片机-89C51部分:9、串行口通讯
  • TTL、RS-232 和 RS-485 串行通信电平标准区别解析
  • 【C语言练习】010. 理解函数参数的传递方式
  • 深度解析Qwen3:性能实测对标Gemini 2.5 Pro?开源大模型新标杆的部署挑战与机遇
  • 牛客周赛 Round 91
  • k8s 学习记录 (六)_Pod 污点和容忍性详解
  • 日常开发小Tips:后端返回带颜色的字段给前端
  • 数据结构:实验7.3Huffman树与Huffman编码
  • 【18】爬虫神器 Pyppeteer 的使用
  • 信息科技伦理与道德3-4:面临挑战
  • 宾馆一次性拖鞋很重要,扬州卓韵酒店用品详细介绍其材质与卫生标准
  • 论文导读 - 基于特征融合的电子鼻多任务深度学习模型研究