【手写系列】纯手写实现JDK动态代理
前言
在Java领域,动态代理应用非常广泛,特别是流行的Spring/MyBatis等框架。JDK本身是有实现动态代理技术的,不过要求被代理的类必须实现接口,不过cglib对这一不足进行了有效补充。本篇博客将涉及2个话题:第一,JDK动态代理的实现原理,带你探索动态代理的实质面目;第二,自己动手写代码去实现JDK动态代理,去创造世界!
JDK动态代理
先写一个例子,感性认识下动态代理~
业务接口:
业务实现类:
业务处理类:
测试类:
运行结果:
在JDK动态代理中涉及如下角色:
业务接口Interface、业务实现类target、业务处理类Handler、JVM在内存中生成的动态代理类$Proxy0
动态代理原理图:
说白了,动态代理的过程是这样的:
第一:Proxy通过传递给它的参数(interfaces/invocationHandler)生成代理类$Proxy0;
第二:Proxy通过传递给它的参数(ClassLoader)来加载生成的代理类$Proxy0的字节码文件;
我们来看看上面例子中生成的$Proxy0的模样:
首先,$Proxy是实现了我们的业务接口(Man)的,所以客户端显然可以调用业务接口的方法。
其次,注意到$Proxy是继承自Proxy,并通过构造方法将业务处理类传入给父类Proxy进行初始化。(实质上,你可以看看源码,在Proxy中存在protected InvocationHandler h;)
很明显,我们看到了业务接口的方法是如何被调用的:
最终都是回调业务处理类(具体的Handler)的invoke方法完成调用!
手写代码实现JDK动态代理
在上面,我们已经分析了JDK动态代理的整个调用过程,接下来,我们就来手写实现它吧!
先来看一眼图:
自定义InvocationHandler:
实现MyInvocationHandler的业务处理Handler:
自定义类加载器MyClassLoader:
为什么要定义一个自定义的类加载器呢?它的作用是什么呢?
要知道,我们是想手写JDK动态代理,那么我们将自己在内存中生成动态代理类,那么我们如何加载呢?这时候,就可以利用自定义的类加载器做到!
上述代码,重写了findClass方法,就是为了在指定路径下加载指定的字节码文件。
自定义MyProxy:
MyProxy的作用就相当于JDK的Proxy。MyProxy做了哪些事情呢?
第一:需要根据interfaces接口构造出动态代理类需要的方法。(其实就是利用反射获取)
第二:把动态生成的代理类(即.java文件)进行编译,生成字节码文件(即.class文件),然后利用类加载进行加载
第三:动态代理类进行加载后,利用反射机制,通过构造方法进行实例化,并在实例化时,初始化业务Hanlder
看一下MyProxy的其他方法:
我们来看一眼生成的$MyProxy0:
OK,到这里,整个JDK的动态代理的实现原理以及手写实现就结束了,你学到了么?
手写系列相关爆文
【手写系列】写出我的第一个框架:迷你版Spring MVC
【手写系列】透彻理解Spring事务设计思想之手写实现
【手写系列】透彻理解MyBatis设计思想之手写实现
【手写系列】纯手写实现一个高可用的RPC
【手写系列】理解数据库连接池底层原理之手写实现
【手写系列】对HashMap的思考及手写实现
【手写系列】写一个迷你版的Tomcat
作者:张丰哲
链接:https://www.jianshu.com/p/58759fef38b8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
【手写系列】纯手写实现JDK动态代理相关推荐
- 【干货】JDK动态代理的实现原理以及如何手写一个JDK动态代理
动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 在解 ...
- 两万字吐血总结,代理模式及手写实现动态代理(aop原理,基于jdk动态代理)
代理模式及手写实现动态代理 一.代理模式 1. 定义 2. 示例 (1)静态代理 (2)动态代理 3. 通用类图 4. 代理模式的优点 二.jdk动态代理实现原理 1. jdk动态代理源码分析(通过该 ...
- 深入理解JDK动态代理原理,使用javassist动手写一个动态代理框架
文章目录 系列文章索引 一.动手实现一个动态代理框架 1.初识javassist 2.使用javassist实现一个动态代理框架 二.JDK动态代理 1.编码实现 2.基本原理 (1)getProxy ...
- 面试造火箭系列,栽在了cglib和jdk动态代理
代理模式 关于代理模式,查阅比较专业的资料是这么定义的:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上 ...
- Spring系列:代理(jdk动态代理,cglib代理)
使用代理的目的: 1)为其他对象提供一种代理以控制对这个对象的访问. 2)方便系统的扩展和测试. 举例两个具体情况: (1)如果那个对象是一个是很大的图片,需要花费很长时间才能显示出来,那么当这个图片 ...
- java jdk动态代理学习记录
转载自: https://www.jianshu.com/p/3616c70cb37b JDK自带的动态代理主要是指,实现了InvocationHandler接口的类,会继承一个invoke方法,通过 ...
- JDK 动态代理之源码解析
过几天我会分享spring AOP 的相关的代理的源码,为了让大家学好springAOP ,今天先分析jdk 的动态代理 1.首先创建一个接口和一个被代理的对象: package com.nandao ...
- 代理模式之jdk动态代理的实现
学习动态代理之前需要了解静态代理 并且牢记静态代理的缺点 //首先被代理的类需要实现一个接口 public interface ProxyInterface {public void say(Stri ...
- 08.jdk动态代理原理
课程标题<jdk动态代理底层原理分析> 课程内容: 1.什么是代理模式 2.代理模式应用场景有哪些 3.代理模式实现方式有哪些 4.静态代理与动态代理区别 5.JDK动态代理原理分析 6. ...
最新文章
- Eclipse配置Tomcat和JDK方法
- 温控窗帘系统制作文档
- spark官方文档_Spark整合Ray思路漫谈
- 高颜值可定制在线绘图工具
- 深入理解乐观锁与悲观锁(实战)
- 【零基础】计算机网络技术
- html 动物特效,分享9款用HTML5/CSS3制作的动物人物动画,
- typescript索引类型_复杂场景下的 typescript 类型锚定 (1) ----- 对象索引提取-阿里云开发者社区...
- C# PPT转图片的解决方案
- 如果网站的 Cookie 特别多特别大,会发生什么情况?
- Codeforces Round #155 (Div. 2) C YY题目
- 小白 C 入门并发疯学习路线(书单)
- 通过EasyPOI导入excel数据
- mysql数据库常用名词_【千寻】MySQL数据库名词注释(持续更新)
- 有没有发现不会写简历,感觉什么都不会?其实写简历也是一种艺术。
- P1036 [NOIP2002 普及组] 选数
- 网易七鱼客服 发起客服-触发两条会话
- Apsara Clouder云计算专项技能认证考试题目和答案
- 人称小Home Assistant版的智能生态系统,智汀究竟可控制多少智能设备?
- 【区间 dp】A005_LC_工作计划的最低难度(暴搜 / dp)