转自:简书,作者:张
www.jianshu.com/p/58759fef38b8
前言
在Java领域,动态代理被广泛使用,尤其是Spring/MyBatis等流行的框架。JDK本身实现了动态代理技术,但是它要求被代理的类必须实现接口。然而,cglib有效地补充了这一不足。本博客将涵盖两个主题:第一,JDK动态代理的实现原理将带您探索动态代理的本质;第二,自己写代码实现JDK动态代理,创造世界!
JDK动态代理
先写个例子,动态代理的感性认识~
业务界面:
业务实现类:
JDK动态代理涉及以下角色:
业务接口、业务实现类目标、业务处理类处理程序和由内存中的JVM生成的动态代理类$Proxy0
动态代理示意图:
findObject
实现我的调用处理程序的业务处理处理程序:
自定义类加载器MyClassLoader:
为什么要定义自定义类加载器?它的作用是什么?
你知道,我们想手工编写JDK动态代理,所以我们将在内存中生成动态代理类,那么我们如何加载它们呢?这时候可以用自定义类加载器来做!
上面的代码重写了findClass方法,以便在指定路径下加载指定的字节码文件。
自定义我的代理:
我的代理的作用相当于JDK的代理。我的代理做了什么?
需要根据interfaces接口构造出动态代理类需要的方法。(其实就是利用反射获取)把动态生成的代理类(即.java文件)进行编译,生成字节码文件(即.class文件),然后利用类加载进行加载动态代理类进行加载后,利用反射机制,通过构造方法进行实例化,并在实例化时,初始化业务Hanlder看看我的代理的其他方法:
编译方法
GetMethodString方法
运行结果
让我们看看生成的$MyProxy0:
好了,这里,JDK的动态代理和手写实现的实现原理结束了。你学会了吗?
1.《jdk动态代理 纯手写实现JDK动态代理》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《jdk动态代理 纯手写实现JDK动态代理》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/tiyu/1744078.html