jdk动态代理(纯手写实现JDK动态代理)

 2025-08-09 14:39:01  阅读 907  评论 0

摘要:前言在Java领域,动态代理应用非常广泛,特别是流行的Spring/MyBatis等框架。JDK本身是有实现动态代理技术的,不过要求被代理的类必须实现接口,不过cglib对这一不足进行了有效补充。本篇博客将涉及2个话题:第一,JDK动态代理的实现原理,带你探索动态代理的实质面目;第二,

纯手写实现JDK动态代理

前言

在Java领域,动态代理应用非常广泛,特别是流行的Spring/MyBatis等框架。JDK本身是有实现动态代理技术的,不过要求被代理的类必须实现接口,不过cglib对这一不足进行了有效补充。本篇博客将涉及2个话题:第一,JDK动态代理的实现原理,带你探索动态代理的实质面目;第二,自己动手写代码去实现JDK动态代理,去创造世界!

JDK动态代理

先写一个例子,感性认识下动态代理~

业务接口:

纯手写实现JDK动态代理

interface

业务实现类:

纯手写实现JDK动态代理

interface impl

业务处理类:

纯手写实现JDK动态代理

Handler

测试类:

纯手写实现JDK动态代理

test

运行结果:

纯手写实现JDK动态代理

result

在JDK动态代理中涉及如下角色:

业务接口Interface、业务实现类target、业务处理类Handler、JVM在内存中生成的动态代理类$Proxy0

动态代理原理图:

纯手写实现JDK动态代理

动态代理的真实面目

说白了,动态代理的过程是这样的:

第一:Proxy通过传递给它的参数(interfaces/invocationHandler)生成代理类$Proxy0;

第二:Proxy通过传递给它的参数(ClassLoader)来加载生成的代理类$Proxy0的字节码文件;

我们来看看上面例子中生成的$Proxy0的模样:

纯手写实现JDK动态代理

$Proxy0

首先,$Proxy是实现了我们的业务接口(Man)的,所以客户端显然可以调用业务接口的方法。

其次,注意到$Proxy是继承自Proxy,并通过构造方法将业务处理类传入给父类Proxy进行初始化。(实质上,你可以看看源码,在Proxy中存在protected InvocationHandler h;)

纯手写实现JDK动态代理

初始化Proxy

纯手写实现JDK动态代理

findObject

很明显,我们看到了业务接口的方法是如何被调用的:

最终都是回调业务处理类(具体的Handler)的invoke方法完成调用!

手写代码实现JDK动态代理

在上面,我们已经分析了JDK动态代理的整个调用过程,接下来,我们就来手写实现它吧!

先来看一眼图:

纯手写实现JDK动态代理

手写实现JDK动态代理

自定义InvocationHandler:

纯手写实现JDK动态代理

MyInvocationHandler

实现MyInvocationHandler的业务处理Handler:

纯手写实现JDK动态代理

MyHandler

自定义类加载器MyClassLoader:

纯手写实现JDK动态代理

MyClassLoader

为什么要定义一个自定义的类加载器呢?它的作用是什么呢?

要知道,我们是想手写JDK动态代理,那么我们将自己在内存中生成动态代理类,那么我们如何加载呢?这时候,就可以利用自定义的类加载器做到!

上述代码,重写了findClass方法,就是为了在指定路径下加载指定的字节码文件。

自定义MyProxy:

纯手写实现JDK动态代理

MyProxy

MyProxy的作用就相当于JDK的Proxy。MyProxy做了哪些事情呢?

第一:需要根据interfaces接口构造出动态代理类需要的方法。(其实就是利用反射获取)

第二:把动态生成的代理类(即.java文件)进行编译,生成字节码文件(即.class文件),然后利用类加载进行加载

第三:动态代理类进行加载后,利用反射机制,通过构造方法进行实例化,并在实例化时,初始化业务Hanlder

看一下MyProxy的其他方法:

纯手写实现JDK动态代理

编译方法

纯手写实现JDK动态代理

getMethodString方法

纯手写实现JDK动态代理

运行结果

我们来看一眼生成的$MyProxy0:

纯手写实现JDK动态代理

$MyProxy0

OK,到这里,整个JDK的动态代理的实现原理以及手写实现就结束了,你学到了么?

GoodBye My Friend~

纯手写实现JDK动态代理

本号已开设如下二十大专题,欢迎关注查看相关专题!

【springboot专题】【spring源码】【mysql优化专题】【HTTP协议】【架构技术专题】【多线程专题】【dubbo专题】【dubbo源码专题】【JVM调优专题】【HTTP专题】【设计模式专题】【高并发专题】【架构技术专题】【Lucene专题】【数据结构专题】【redis专题】【mq中间件专题】【netty专题】【java面试专题】【zookeeper】

闷骚的大屌程序员富一代们↓↓↓↓

点个赞、留个言再走可好↓↓

版权声明:我们致力于保护作者版权,注重分享,被刊用文章【jdk动态代理(纯手写实现JDK动态代理)】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!;

原文链接:https://www.yxiso.com/zhishi/2039372.html

标签:jdk动态代理

发表评论:

关于我们
院校搜的目标不仅是为用户提供数据和信息,更是成为每一位学子梦想实现的桥梁。我们相信,通过准确的信息与专业的指导,每一位学子都能找到属于自己的教育之路,迈向成功的未来。助力每一个梦想,实现更美好的未来!
联系方式
电话:
地址:广东省中山市
Email:beimuxi@protonmail.com

Copyright © 2022 院校搜 Inc. 保留所有权利。 Powered by BEIMUCMS 3.0.3

页面耗时0.0379秒, 内存占用1.93 MB, 访问数据库24次

陕ICP备14005772号-15