当前位置: 首页 > 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会根据情况自动选择最合适的代理方式。

相关文章:

  • Rust 的 Web 世界:actix_web 轻松接收 JSON 请求体
  • 第一讲 | 算法复杂度
  • 1.4 点云数据获取方式——结构光相机
  • Reactor框架介绍
  • 嵌入式音视频实时通话EasyRTC打造设备安装与调试的高效远程解决方案
  • AWS创建多块盘并创建RAID0以及后增加空间
  • (02)Redis 的订阅发布Pub/Sub
  • 基于C#窗体+GDI+绘图实现分形树
  • 华锐视点历经十八年沉淀所形成的产品特性
  • Electron-vite中ELECTRON_RENDERER_URL环境变量如何被设置的
  • java 加入本地lib jar处理方案
  • 如何创建并使用极狐GitLab 议题模板?
  • HarmonyOS运动开发:如何监听用户运动步数数据
  • 基于Lucene的多场景检索系统开发指南
  • docker 通过定时任务恢复MySQL数据库
  • P1494 [国家集训队] 小 Z 的袜子 Solution
  • Java 基础--运算符全解析
  • MySQL 连接池 (Pool) 常用方法详解
  • HTML应用指南:利用POST请求获取全国达美乐门店位置信息
  • 【网络编程】UDP协议 和 Socket编程
  • 解放日报:这是一场需要定力和实力的“科技长征”
  • 15世纪以来中国文化如何向欧洲传播?《东学西传文献集成初编》发布
  • 习近平访问金砖国家新开发银行
  • 王毅:携手做世界和平与发展事业的中流砥柱
  • 开门红背后的韧性密码:上海八大企业的“反脆弱”与“真功夫”
  • 法院为“外卖骑手”人身权益撑腰:依法认定实际投保人地位