Java动态代理详解

心靈之曲
发布: 2025-11-16 09:46:02
原创
420人浏览过

动态代理自接触java以来便经常被提到,但过去始终没有深入研究,大多只是浅尝辄止。如今静下心来认真梳理其实现过程,才发现其原理并不晦涩难懂。通过亲自编写一个示例程序,基本掌握了它的核心机制与正确使用方式。只要肯投入时间去理解,并动手实践整个流程,掌握动态代理并非难事。

1、 动态代理的核心在于:根据目标对象a,动态生成一个与其对应的代理实例。

2、 该功能由JDK提供的java.lang.reflect包中的Proxy类实现,通过调用其静态方法完成代理对象的创建。

3、 此方法需要传入三个参数。

4、 第一个参数是类加载器,用于加载被代理类的字节码,可通过反射获取:a.getClass().getClassLoader()

立即学习Java免费学习笔记(深入)”;

5、 第二个参数是接口数组,表示目标对象所实现的所有接口(不是方法列表),可通过a.getClass().getInterfaces()获得。

6、 第三个参数是调用处理器,需自定义一个类H并实现InvocationHandler接口,该接口中包含一个invoke方法,用来定义方法调用时的具体处理逻辑。

7、 h 是实现了InvocationHandler接口的实例。一旦获取了代理对象,任何对其方法的调用都会自动转发到 h 的 invoke 方法中,再由 invoke 内部将请求委派给原始对象 a 的对应方法执行。

Java动态代理详解

Java动态代理详解

8、 编写测试类,首先模拟无代理情况下的运行场景

9、 定义一个House类和IHouse接口。House类具有name属性,通过构造函数初始化,并实现buy方法以完成购房操作。

Java动态代理详解

Java动态代理详解

10、 创建一个人物类People,模拟“小明”这一角色,其中添加一个名为buyHouseByMyself的方法,用于描述个人直接购房的行为,不借助中介。

Java动态代理详解

11、 创建测试类TestDynamicProxy,在测试方法中声明一个名为“小明”的People对象和一个house实例,随后让小明调用buyHouseByMyself方法,执行自行购房流程。

12、 输出结果如下所示:

Java动态代理详解

Java动态代理详解

13、 接下来进行动态代理版本的测试

14、 创建一个名为 MyInvocationHandler 的类,实现 InvocationHandler 接口,并重写 invoke 方法。该类提供一个构造函数,接收一个 Object 类型的 target 参数,用于传入被代理的目标对象。通过此方式将目标对象注入处理器中,以便在方法调用时统一拦截并处理,从而实现灵活的方法增强。

15、 在 invoke 方法中,使用 method.invoke(target, args) 语句通过反射机制调用目标对象 target 上的方法 method,并传入参数 args,最终将返回结果赋值给 object 变量,完成动态方法调用。

钉钉 AI 助理
钉钉 AI 助理

钉钉AI助理汇集了钉钉AI产品能力,帮助企业迈入智能新时代。

钉钉 AI 助理 21
查看详情 钉钉 AI 助理

16、 由于 MyInvocationHandler 构造函数接受的是 Object 类型,因此它可以适配任意类型的对象,具备高度通用性与扩展能力,适用于多种不同业务场景下的动态代理需求。

Java动态代理详解

Java动态代理详解

17、 完成 MyInvocationHandler 类后,即可着手获取代理对象。新建 ProxyClass 类,并定义 getDynamicProxy 方法用于生成动态代理实例,该方法接收一个 Object 类型的参数,代表需要代理的目标对象。

18、 该方法可为任意对象生成代理实例,具有良好的通用性。

19、 创建代理对象时,需先实例化 MyInvocationHandler 对象 handle,并将其作为参数传递给 Proxy.newProxyInstance 方法。此后,所有对代理对象 proxy 的方法调用,都将被重定向至 handle 的 invoke 方法中进行处理,从而实现方法的拦截与功能增强。

20、 另外两个参数分别是目标对象的类加载器及其所实现接口的集合。

21、 代理类创建完成后,开始测试通过代理完成购房的过程。

22、 在 People 类中新增一个 buyHouseByDynamicProxy 方法,接收一个 House 实例作为参数。

23、 在该方法中,通过 ProxyClass 获取 house 的代理对象 houseProxy,并调用其 buy 方法完成购房操作。

Java动态代理详解

24、 在 TestDynamicProxy 类中编写 testBuyHouseByProxy 测试方法,创建一个名为“小红”的 People 实例,调用 buyHouseByDynamicProxy 方法,利用动态代理机制完成购房流程,验证代理机制的有效性。

25、 成功通过代理对象调用了 House 的 buy 方法,输出结果显示调用链路正确执行。

Java动态代理详解

Java动态代理详解

26、 从本例可以看出,无论传入何种对象,只需调用 ProxyClass 的 getDynamicProxy 方法,即可快速获得其代理实例,无需关心具体类型,体现出极强的通用性和灵活性,极大简化了代理对象的创建过程,提升了代码复用率与系统可扩展性。

27、 相较于静态代理,动态代理的优势在于无需为每个被代理类单独编写代理类。在静态代理模式下,每新增一个被代理类就需要配套编写一个新的代理类,当数量庞大时会导致类爆炸,维护成本陡增。

28、 比如原本要分别定义 HouseProxy、FishProxy、CarProxy 等多个代理类,而采用动态代理后,仅需一个通用的 ProxyClass 即可满足所有对象的代理需求,避免了大量重复代码,显著优化了项目结构,增强了系统的可维护性与可拓展性。

29、 小明想要买房,于是通过代理找到中介,由中介代为办理相关事务,省时又省心。

30、 中介在帮小明购房的过程中可以额外做一些事情,这些行为就体现在 MyInvocationHandler 的 invoke 方法中,即在 method.invoke 前后插入自定义逻辑。

31、 利用动态代理机制,可以实现类似 Spring AOP 的功能,例如为方法添加事务控制,或在方法执行前后打印日志,从而集中管理横切关注点,提升系统的模块化程度。

以上就是Java动态代理详解的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号