
Java动态代理的实现方式
发布日期:2025-04-02 01:25:18
浏览次数:11
分类:精选文章
本文共 2668 字,大约阅读时间需要 8 分钟。
Java动态代理的实现方式
什么是动态代理?
动态代理是一种编程模式,允许在运行时创建代理对象,以实现对目标对象的方法进行增强。代理对象与目标对象具有相同的接口,但在执行特定逻辑时嵌入增强功能或 调用其他对象的方法。动态代理通过动态生成代理对象的方式,为目标对象添加功能,如日志记录、事务管理等,减少代码耦合,降低代码重复率。
动态代理的作用
动态代理适用于在不侵入目标类逻辑的前提下,添加公共功能。例如:
- 记录日志记录:跟踪对象方法的调用情况。
- 管理事务:确保方法执行的原子性和持久性。
- 监控性能:统计方法执行时间。
这种方法能在不修改目标对象代码的前提下,降低代码耦合度,减少重复代码。
动态代理的使用场景
动态代理广泛应用于:
- Spring AOP:通过动态代理实现方法级别的切割,如事务管理、日志记录等。
- 手动创建代理:针对特定场景,按需动态生成代理对象。
动态代理的实现技术
1. JDK动态代理技术(基于接口)
- 适用条件:目标类必须有接口。
- 实现方式:通过
Proxy.newProxyInstance
方法创建代理对象。开源框架如Spring AOP默认使用该技术。
2. Cglib动态代理技术(基于子类)
- 适用条件:目标类没有接口且不能被
final
修饰。 - 实现方式:通过生成目标类的动态子类实现。Spring AOP可通过配置强制使用此技术。
动态代理实现对比
特性 | JDK动态代理技术 | Cglib动态代理技术 |
---|---|---|
目标类要求 | 有接口 | 无接口,不能有final 修饰 |
生成方式 | 基于接口动态实现类 | 基于目标类生成动态子类 |
优点 | 非侵入性,代码独立性强 | 适用于不能实现接口或切断 inheritance |
缺点 | 需要接口接口分离 | 難以处理 final 方法,不能链式调用 |
手动创建JDK动态代理
public interface JDKService { void show(String s);}public class JDKServiceImpl implements JDKService { @Override public void show(String s) { System.out.println("JDKService show......" + s); }}public class JDKProxyDemo { public static void main(String[] args) { JDKService jdkService = new JDKServiceImpl(); Object proxyInstance = Proxy.newProxyInstance( jdkService.getClass().getClassLoader(), jdkService.getClass().getInterfaces(), (proxy, method, args) -> { System.out.println("Method: " + method.getName()); System.out.println("Args: " + Arrays.toString(args)); Object result = method.invoke(jdkService, args); System.out.println("Result: " + result); return result; } ); JDKService proxy = (JDKService) proxyInstance; proxy.show("hello"); }}
Cglib动态代理手动创建
public class Target { public void show(String s) { System.out.println("Target show.......... " + s); }}public class Advice { public void before() { System.out.println("Advice before ......"); } public void after() { System.out.println("Advice after ......."); }}public class CglibProxyDemo { public static void main(String[] args) { Target target = new Target(); Advice advice = new Advice(); // 动态增强器 Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Target.class); // 设置被代理类 // 回调增强 enhancer.setCallback((MethodInterceptor o, Method method, Object objects, MethodProxy methodProxy) -> { advice.before(); Object result = method.invoke(target, objects); advice.after(); return result; }); Target proxy = (Target) enhancer.create(); proxy.show("hello"); }}
到这里,文章完成,涵盖了动态代理的实现方式,包括两种技术的特点及典型实现示例。文章结构清晰,便于阅读和理解。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月22日 19时46分06秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java动态代理的两种实现方法
2025-04-02
Java动态代理的实现方式
2025-04-02
JAVA动态代理简单总结
2025-04-02
java勤工助学管理系统
2025-04-02
Java包装类、拆箱和装箱详解
2025-04-02
Java匹配文件流特定数据块方法
2025-04-02
java单例模式
2025-04-02
java博客后台管理系统(源码+开题报告)
2025-04-02
Java原型模式(Prototype模式)
2025-04-02
Java参数传递到底是按 值传递 还是 引用传递 ?
2025-04-02
JAVA反射
2025-04-02
Java反射
2025-04-02
java反射介绍
2025-04-02
Java反射代码编写
2025-04-02
JAVA反射机制
2025-04-02
JAVA反射机制
2025-04-02
java反射机制之Method invoke执行调用方法例子
2025-04-02
java反射的使用
2025-04-02
Java反射获取private属性和方法(子类,父类,祖先....)
2025-04-02