专栏首页Java工程师日常干货纯手写实现JDK动态代理前言JDK动态代理 手写代码实现JDK动态代理

纯手写实现JDK动态代理前言JDK动态代理 手写代码实现JDK动态代理

前言

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

JDK动态代理

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

业务接口:

interface

业务实现类:

interface impl

业务处理类:

Handler

测试类:

test

运行结果:

result

在JDK动态代理中涉及如下角色: 业务接口Interface、业务实现类target、业务处理类Handler、JVM在内存中生成的动态代理类$Proxy0

动态代理原理图:

动态代理的真实面目

说白了,动态代理的过程是这样的: 第一:Proxy通过传递给它的参数(interfaces/invocationHandler)生成代理类$Proxy0; 第二:Proxy通过传递给它的参数(ClassLoader)来加载生成的代理类$Proxy0的字节码文件;

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

$Proxy0

首先,$Proxy是实现了我们的业务接口(Man)的,所以客户端显然可以调用业务接口的方法。 其次,注意到$Proxy是继承自Proxy,并通过构造方法将业务处理类传入给父类Proxy进行初始化。(实质上,你可以看看源码,在Proxy中存在protected InvocationHandler h;)

初始化Proxy

findObject

很明显,我们看到了业务接口的方法是如何被调用的: 最终都是回调业务处理类(具体的Handler)的invoke方法完成调用!

手写代码实现JDK动态代理

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

先来看一眼图:

手写实现JDK动态代理

自定义InvocationHandler:

MyInvocationHandler

实现MyInvocationHandler的业务处理Handler:

MyHandler

自定义类加载器MyClassLoader:

MyClassLoader

为什么要定义一个自定义的类加载器呢?它的作用是什么呢? 要知道,我们是想手写JDK动态代理,那么我们将自己在内存中生成动态代理类,那么我们如何加载呢?这时候,就可以利用自定义的类加载器做到! 上述代码,重写了findClass方法,就是为了在指定路径下加载指定的字节码文件。

自定义MyProxy:

MyProxy

MyProxy的作用就相当于JDK的Proxy。MyProxy做了哪些事情呢? 第一:需要根据interfaces接口构造出动态代理类需要的方法。(其实就是利用反射获取) 第二:把动态生成的代理类(即.java文件)进行编译,生成字节码文件(即.class文件),然后利用类加载进行加载 第三:动态代理类进行加载后,利用反射机制,通过构造方法进行实例化,并在实例化时,初始化业务Hanlder

看一下MyProxy的其他方法:

编译方法

getMethodString方法

运行结果

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

$MyProxy0

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

GoodBye My Friend~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【随笔】JVM核心:JVM运行和类加载

    本篇博客将写一点关于JVM的东西,涉及JVM运行时数据区、类加载的过程、类加载器、ClassLoader、双亲委派机制、自定义类加载器等,这些都是博主自己的一点...

    用户2890438
  • MyBatis+Spring MVC开发指南(二)前言高级映射延迟加载查询缓存MyBatis和Spring整合逆向工程

    接《MyBatis+Spring MVC开发指南(一)》,本篇博客将涵盖MyBatis高级映射(一对一,一对多、多对多)、延迟加载、缓存原理分析(一级缓存、二级...

    用户2890438
  • 写一个迷你版的Tomcat前言Write MyTomcat

    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!

    用户2890438
  • 手把手带你实现JDK动态代理

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

    java进阶架构师
  • 纯手写实现JDK动态代理

    在Java领域,动态代理应用非常广泛,特别是流行的Spring/MyBatis等框架。JDK本身是有实现动态代理技术的,不过要求被代理的类必须实现接口,不过cg...

    java思维导图
  • java 开发常用错误集锦

    1.org.apache.catalina.deply.WebXml addServer错误: Maven工程中用到的tomcat的catalina.jar,...

    pydata
  • Java 类机制(2)---- 类加载过程

    大家好,在该专栏的上一篇文章中我们介绍了一下关于 Java 中类的相关知识点。那么这篇文章我们来看一下一个 Java 类是怎么被虚拟机加载并使用的,本文内容参考...

    指点
  • Java魔法堂:类加载器入了个门

    一、前言                               《Java魔法堂:类加载机制入了个门》中提及整个类加载流程中只有加载阶段作为码农的我们可以...

    ^_^肥仔John
  • Slackor:Go语言写的一款C&C服务器

    这将执行InvokeWebRequest(PS v.3 +)以下载payload,使用LOLBin执行它

    FB客服
  • ClassLoader和类加载机制

    01 背景 最近在做项目的过程中,由于系统需要提供一个对外接口,使系统使用者可以以脚本的形式提交自己的代码,每个用户可以在系统规范的约束下编写脚本,由系统去执...

    用户1332428

扫码关注云+社区

领取腾讯云代金券