news 2026/11/6 6:22:13

JDK动态代理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JDK动态代理

首先通俗的介绍什么是代理,我以自身的一个例子来说吧,主播特别喜欢一款游戏,那个游戏做任务会给很多奖励,但是呢我平常没有那么多时间来做任务,又想要得做完任务给的奖励,所以我找了一个游戏带打,可以帮我刷任务,我可以直接想用奖励就行了,美滋滋啦。

下面让我来从代理模式来分析一下吧,上面中的我就是被代理的对象,叫做目标类,而我找的代打叫做代理对象。

动态代理-JDK动态代理

要求目标对象必须要实现至少一个接口,java动态代理会创建实现了相同接口的代理类,然后在运行时动态生成该代理类的实例。

那么JDK动态代理为什么要实现至少一个接口?

因为JDK动态代理的核心类是java.lang.reflect.Prox,这个类的实现方式如下:

其次,JDK在动态代理的时候会生成一个新的类,这个类继承于java.lang.reflect.Prox,由于java是单继承,代理类已经实现了继承proxy,所以只能通过实现接口的方式来代理方法

下面我来讲讲JDK动态代理实现流程

DK动态代理通过Proxy类创建代理对象,所有对代理对象的方法调用都会被转发到实现了InvocationHandler接口的处理器(handler)的invoke()方法中,从而实现方法调用的拦截和增强。

下面让我来分步讲解

首先创建业务类的接口和实现类这俩就不细讲了,直接上车

现在我们已经有了目标类,也就是上图的OrderService类,然后来创建代理类

代理类呢是通过拦截目标类的方法调用,通过代理类来调用目标类的方法,所以呢先通过静态工厂方法创建代理类也就是先找一个帮我刷任务的人

下面让我来解释一下创建代理对象要传的三个参数

ClassLoader loader:动态加载代理类到JVM,确保代理类和目标类在同一个类加载器作用域中

有以下几种方式

// 通常使用目标对象的类加载器 ClassLoader loader = target.getClass().getClassLoader(); // 也可以使用线程上下文类加载器 ClassLoader loader = Thread.currentThread().getContextClassLoader(); // 或使用接口的类加载器 ClassLoader loader = UserService.class.getClassLoader();

Class<?>[] interfaces:定义代理类要实现哪些接口

// 获取目标对象实现的所有接口 Class<?>[] interfaces = target.getClass().getInterfaces(); // 例如返回:[UserService.class, Serializable.class] // 也可以手动指定接口 Class<?>[] interfaces = new Class[]{UserService.class};

如果返回了空数组就会创建失败,这也是为什么目标对象至少要实现一个接口

InvocationHandler :处理器

拦截所有代理对象的方法调用,并且通过重写拦截器中invoke()方法来实现对目标类功能的一些加强,比如添加日志之类的

MyInvocationHandler处理器类实现了InvocationHandler接口

private Object target; 存储真实业务对象的引用(如OrderServiceImpl),通过构造器注入依赖

这儿有一个问题,依赖注入为什么要用构造器注入,set注入不行吗?

1.多线程环境下,有可能没有进行setTarget(),别的线程就进行调用,此时target为null

例如:

2.InvocationHandler要求创建后立即可用:

构造器注入在实例化时完成了属性注入,而setter注入是先进行实例化再进行实例化,target可能不完整

3. 使用构造器注入 + final:不可变,线程安全,而setter注入对注入字段不能加final关键字

下面讲一下重写invoke函数的参数意义

proxy-代理对象引用:动态生成的代理类实例,用于方法转发

method-方法元数据:包含被调用方法的所有信息,用于反射调用

args-实际参数值:调用时传入的具体参数值数组

method.invoke():是通过反射机制调用目标对象类,target是目标对象类,args是调用方法时传入的参数。

下面就是测试类了

JDK动态代理主要流程如下:

客户端 → 代理对象 → InvocationHandler.invoke() → 反射调用真实对象方法

总结下来就是一句话:

JDK动态代理=Proxy创建 +InvocationHandler拦截 +接口约束,实现运行时的无侵入式方法增强。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/6 5:36:06

25、寻找生成元和离散对数:算法与应用

寻找生成元和离散对数:算法与应用 1. 寻找生成元和计算乘法阶 在数论和密码学中,寻找生成元和计算离散对数是重要的问题。当我们面对在 $Z_p^*$ 中寻找生成元和计算离散对数的任务时,会遇到不同的情况和挑战。 1.1 已知部分信息寻找特定阶元素 假设我们没有 $p - 1$ 的素…

作者头像 李华
网站建设 2026/11/6 4:01:31

29、矩阵知识全解析:从基础定义到高斯消元法

矩阵知识全解析:从基础定义到高斯消元法 1. 引言 矩阵在数学和计算机科学中有着广泛的应用。我们将从非常通用的视角出发,先讨论元素位于任意环 (R) 中的矩阵,然后再专门讨论元素位于域 (F) 中的矩阵,因为在域的情况下能得到更多的结论。本文的一个主要目标是讨论“高斯消…

作者头像 李华
网站建设 2026/11/6 3:59:41

36、多项式算术及其应用

多项式算术及其应用 1. 多项式相关问题与算法基础 在多项式的研究中,有一些有趣的问题和基础算法值得探讨。例如,给定一对多项式 (a, b \in \mathbb{Z}[X]) 以及它们在 (\mathbb{Q}[X]) 中的最大公约数 (d),需要设计一个高效算法来计算它们在 (\mathbb{Z}[X]) 中的最大公约…

作者头像 李华
网站建设 2026/11/5 13:24:26

37、多项式算术及其应用

多项式算术及其应用 在数学和计算机科学领域,多项式算术有着广泛的应用。本文将深入探讨多项式矩阵乘法、有理函数重构及其应用,以及更快的多项式算术算法。 1. 多项式矩阵乘法 当需要对两个元素为 (F[X]) 的矩阵进行乘法运算时,可以利用多项式的中国剩余定理来加速计算。…

作者头像 李华
网站建设 2026/11/6 4:13:37

Calibre-Douban插件:元数据管理与电子书整理的高效解决方案

还在为电子书信息缺失而抓狂吗&#xff1f;每次手动输入书籍信息都让你感到效率低下&#xff1f;Calibre-Douban插件作为一款专业的Calibre插件&#xff0c;通过智能化的自动化工具&#xff0c;彻底解放你的双手&#xff0c;让电子书整理变得轻松高效。 【免费下载链接】calibr…

作者头像 李华
网站建设 2026/11/6 0:31:45

31、集群架构全解析:类型、配置与最佳实践

集群架构全解析:类型、配置与最佳实践 1. 集群软件概述 集群软件能够创建单一系统映像,并将任务分配到所有节点上并发执行。任务通过消息传递库进行协调,结果也通过该库进行通信。常见的集群软件应用示例包括 Oracle Real Application Clusters (RAC) 和 IBM Sysplex Data…

作者头像 李华