专栏首页java思维导图纯手写实现JDK动态代理

纯手写实现JDK动态代理

转自:简书,作者:张丰哲 www.jianshu.com/p/58759fef38b8

前言

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

JDK动态代理

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

业务接口:

业务实现类:

业务处理类:

测试类:

运行结果:

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

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

动态代理原理图:

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

  1. Proxy通过传递给它的参数(interfaces/invocationHandler)生成代理类$Proxy0;
  2. Proxy通过传递给它的参数(ClassLoader)来加载生成的代理类$Proxy0的字节码文件;

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

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

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

初始化Proxy

findObject

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

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

手写代码实现JDK动态代理

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

先来看一眼图:

自定义InvocationHandler:

实现MyInvocationHandler的业务处理Handler:

自定义类加载器MyClassLoader:

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

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

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

自定义MyProxy:

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

  1. 需要根据interfaces接口构造出动态代理类需要的方法。(其实就是利用反射获取)
  2. 把动态生成的代理类(即.java文件)进行编译,生成字节码文件(即.class文件),然后利用类加载进行加载
  3. 动态代理类进行加载后,利用反射机制,通过构造方法进行实例化,并在实例化时,初始化业务Hanlder

看一下MyProxy的其他方法:

编译方法

getMethodString方法

运行结果

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

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

本文分享自微信公众号 - java思维导图(java-mindmap)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-01

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java 静态代理、Java动态代理、CGLIB动态代理

    Java 的代理就是客户类不再直接和委托类打交道, 而是通过一个中间层来访问, 这个中间层就是代理。为啥要这样呢, 是因为使用代理有 2 个优势:

    java思维导图
  • 所有和Java中代理有关的知识点都在这了。

    对于每一个Java开发来说,代理这个词或多或少都会听说过。你可能听到过的有代理模式、动态代理、反向代理等。那么,到底什么是代理,这么多代理又有什么区别呢。本文就...

    java思维导图
  • java动态代理实现与原理详细分析

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理。

    java思维导图
  • 纯手写实现JDK动态代理前言JDK动态代理 手写代码实现JDK动态代理

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

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

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

    java进阶架构师
  • java 开发常用错误集锦

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

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

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

    ^_^肥仔John
  • Java 类机制(2)---- 类加载过程

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

    指点
  • Slackor:Go语言写的一款C&C服务器

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

    FB客服
  • 什么是classloader和双亲委派

    阿杜

扫码关注云+社区

领取腾讯云代金券