转自:简书,作者:张

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