返回顶部
首页 > 资讯 > 精选 >纯手写实现JDK动态代理
  • 824
分享到

纯手写实现JDK动态代理

2023-06-02 19:06:38 824人浏览 独家记忆
摘要

作者:张丰哲原文:https://www.jianshu.com/p/58759fef38b8前言在Java领域,动态代理应用非常广泛,特别是流行的spring/mybatis等框架。jdk本身是有实现动态代理技术的,不过要求被代理的类必须

作者:张丰哲

原文:https://www.jianshu.com/p/58759fef38b8

前言

在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的动态代理的实现原理以及手写实现就结束了,你学到了么?

--结束END--

本文标题: 纯手写实现JDK动态代理

本文链接: https://lsjlt.com/news/231024.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 纯手写实现JDK动态代理
    作者:张丰哲原文:https://www.jianshu.com/p/58759fef38b8前言在Java领域,动态代理应用非常广泛,特别是流行的Spring/MyBatis等框架。JDK本身是有实现动态代理技术的,不过要求被代理的类必须...
    99+
    2023-06-02
  • JDK动态代理过程原理及手写实现详解
    目录JDK动态代理的过程手写实现JDK动态代理创建MyInvocationHandler接口创建MyClassLoader类加载器创建代理类使用自定义动态代理类创建接口创建被代理接口...
    99+
    2024-04-02
  • Java如何实现JDK动态代理
    这篇文章主要讲解了“Java如何实现JDK动态代理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java如何实现JDK动态代理”吧!概念代理:为控制A对象,而创建出新B对象,由B对象代替执行...
    99+
    2023-07-02
  • JDK动态代理,代理接口没有实现类,实现动态代理方式
    目录JDK动态代理,代理接口没有实现类,实现动态代理被代理的接口:代理对象:那么接下来测试一下:jdk动态代理为什么要接口先通过一个简单例子实现功能:编写测试方法:里面的getPro...
    99+
    2024-04-02
  • JDK和CGLib动态代理怎么实现
    本篇内容介绍了“JDK和CGLib动态代理怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言:动态代理是一种常用的设计模式,广泛应用...
    99+
    2023-06-02
  • Java——JDK动态代理
    1.动态代理 1.1什么是动态代理? 动态代理(理解) 基于反射机制 举个例子,生活中一般在打官司的时候都会请代理律师,为什么要请律师呢?是因为开庭的时候大部人对于打官司没有经验,只会说出自己案件的陈述,并不会根据法律等争取自己权益...
    99+
    2023-08-31
    java 开发语言
  • Java实现JDK动态代理的原理详解
    目录概念案例静态代理JDK动态代理模式原理分析真相大白概念 代理:为控制A对象,而创建出新B对象,由B对象代替执行A对象所有操作,称之为代理。一个代理体系建立涉及到3个参与角色:真实...
    99+
    2024-04-02
  • jdk动态代理和cglib动态代理详解
    目录静态代理基于继承的方式实现静态代理基于聚合的方式实现静态代理继承与聚合方式实现的静态代理对比动态代理JDK动态代理如何实现一个HashMap的动态代理类?Cglib动态代理JDK...
    99+
    2024-04-02
  • 基于jdk动态代理和cglib动态代理实现及区别说明
    目录jdk动态代理和cglib动态代理实现及区别jdk动态代理实现cglib动态代理区别总结jdk动态代理和cglib动态代理实现及区别 代理模式是一种设计模式,提供了对目标对象额外...
    99+
    2023-05-19
    jdk动态代理 cglib动态代理 jdk和cglib动态代理区别
  • java jdk动态代理详解
    jdk动态代理要对一个类进行代理,被代理的类必须实现至少一个接口,并且只有接口中的方法才能被代理。 jdk实现动态代理一般分为三步: 1. 编写接口和实现类。 2. 写一个处理器,该...
    99+
    2022-11-15
    java jdk 动态代理
  • spring cglib 与 jdk 动态代理
    1. 概述JDK动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理Cglib动态代理是 利用asm开源包 把被代理类的class文件加载进来 通过修改其字节码生成子类来处...
    99+
    2023-05-31
    spring cglib jdk
  • jdk动态代理使用实例详解
    目录前言为什么需要代理java中常用的代理模式一、JDK 动态代理二、cglib静态代理三、spring中代理的使用总结前言 代理模式不管是JDK,spring框架,还是日常的开发中...
    99+
    2024-04-02
  • 在Java中实现JDK动态代理的原理是什么
    在Java中实现JDK动态代理的原理是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、什么是代理?代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对...
    99+
    2023-05-31
    java jdk 动态代理
  • JDK动态代理和CGLIB区别
    JDK动态代理和CGLIB区别1、JDK动态代理:利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。(相关视频教程分享:java视频...
    99+
    2020-11-10
    java教程 JDK CGLIB 区别
  • 通俗易懂 快速理解 JDK动态代理 和 cglib动态代理
    动态代理的实现方案有两种,JDK动态代理和CGLIB动态代理,区别在于JDK自带的动态代理,必须要有接口,而CGLIB动态代理有没有接口都可以。 JDK动态代理:JDK原生的实现方式,需要被代理的...
    99+
    2023-10-21
    java spring
  • 基于JDK动态代理原理解析
    目录1、回顾一下JDK动态代理的核心参数2、实现一个简单的动态代理①、定义接口Subject②、定义接口的实现类RealSubject③、定义代理对象创建工厂④、创建测试类,为tar...
    99+
    2023-05-18
    JDK动态代理原理 JDK动态代理 动态代理原理
  • 解读jdk动态代理为什么必须实现接口
    目录使用jdk生成代理类生成代理的字节码总结使用jdk生成代理类 通过jdk实现的动态代理会使用Proxy的newProxyInstance方法: 写一个类实现Invocation...
    99+
    2023-02-17
    jdk动态代理 jdk代理 jdk动态代理接口
  • 深入理解java动态代理的两种实现方式(JDK/Cglib)
    什么是代理模式?代理模式:在调用处不直接调用目标类进行操作,而是调用代理类,然后通过代理类来调用目标类进行操作。在代理类调用目标类的前后可以添加一些预处理和后处理操作来完成一些不属于目标类的功能。为什么要使用代理模式?通过代理模式可以实现对...
    99+
    2023-05-31
    cglib jdk java
  • JDK中动态代理的示例分析
    这篇文章将为大家详细讲解有关JDK中动态代理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。动态代理步骤创建一个实现接口InvocationHandler的类,它必须实现invoke方法创建被代理...
    99+
    2023-06-15
  • java动态代理实现代码
    目录1、代理模式2、动态代理3、原理研究4、应用5、总结1、代理模式 代理模式是常用的设计模式之一,也是开发中常见的设计模式。 简单的描述一下,代理模式就是将实现类隔离开,比如你想给...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作