手绘6张图彻底搞懂动态代理.docx
《手绘6张图彻底搞懂动态代理.docx》由会员分享,可在线阅读,更多相关《手绘6张图彻底搞懂动态代理.docx(8页珍藏版)》请在第一文库网上搜索。
1、手绘6张图彻底搞懂动态代理在讲解动态代理前我们先聊聊什么是静态代理。静态代理假设有一天领导突发奇想,给你下发了一个需求:统计项目中所有类的方法执行耗时。在拿到需求的那一刻,脑海中冒出来的第一个想法是:在每个方法的第一行和最后一行加上时间埋点,再打印一行志不就完事了。抄起键盘准备开干,想了想又开始犹豫了:在每个方法都加几行代码,这不是侵入式修改吗?听架构师大佬说这样的场景可以用代理模式,那尝试一下,具体做法如下。静态代理的实剧(1)为工程里每个类都写一个代理类,让它与目标类实现同一个接口。图中标红色的就是代理类。 wofk()AProxyAlmpl+ wofk()BProxylnterfaceB
2、(2)在代理类里面维护一个Fl标实现类,调用代理类的方法时还是会去调用目标类的方法,只不过在前后加了一些其他逻辑代码。也就是说后面客户端不需要直接调用目标实现类,只需要调用代理类即可,这样就间接调用了对应方法。用一个公式总结一下:代理类=增强代码+目标实现类。下面这个图中,计算耗时的逻辑就是增强代码。(3)在所有new目标类的地方都替换为new代理类,并将目标类作为构造方法参数传入;所有使用目标类调用的地方全部都替换为代理类调用。如果你看懂了上面的实现方法,那么恭喜你已经掌握了静态代理的核心思想。静态代理的缺司静态代理的思路非常简单,就是给每一个目标实现类写一个对应的代理实现类,但是如果一个项
3、目有几千甚至有几万个类,这个工作量可想而知。前面我们还隐藏了一个假设:每个类都会实现一个接口。那如果一个类没有实现任何接口,代理类如何实现呢?成Class对象;好了,我们来总结一下静态代理的缺点:静态代理需要针对每个目标实现类写一个对应的代理类,如果目标类的方法有变动,代理类也要跟着动,维护成本非常高。静态代理必须依赖接口。既然知道了静态代理的缺点,那有没有办法实现少些或者不写代理类来实现代理功能呢?答案是有,动态代理。对象的创建流程在正式介绍动态代理前,我们先复习一下java中对象是如何创建的。JVM运行时区域我们在项目中使用一行代码就可以简单创建一个对象,实际上经过的流程还是很复杂的。(1
4、) java源文件经过编译生成字节码文件(.class结尾);(2)类加载器将class文件加载到JVM内存中,就是常说的方法区,生(3)执行new,申请一块内存区域,紧接着创建一个对象放在JVM对象,准确地说是新生代;上面的流程中提到了 Class对象,有两个概念初学者很容易混淆:Class对象和Class对象简单来说就是Class类的实例,Class类描述了所有的类;实例对象是通过Class对象创建出来的。从上面的分析可以看出来,要想创建一个实例,最最关键的是获得Class对象。有些同学可能有疑问了,我写代码的时候创建对象没有用到Class对象呀,那是因为Java语言底层帮你封装了细节。J
5、ava语言给我们提供了 new这个关键字,new实在太好用了,一行代码就可以创建一个对象。我们再问到前面讲的静态代理,静态代理最重要的是提前写一个代理类,有了代理类就可以new 一个代理对象。但是每次都去写一个代理类是不是太麻烦了? !再稍微扩展一下思路,有没有办法不写代理类还能生成一个代理对象呢?可以,上面讲的通过代理类Class对象就可以生成代理对象,那如何获取代理类Class对象呢?我们接着往下看。动态代理Class对象包含了一个类的所有信息,如:构造方法、成员方法、成员属性等。如果我们不写代理类,似乎无法获得代理类Class对象,但稍稍动一动脑:代理类和目标类实现的是同一组接口,是不是
6、可以通过接口间接获得代理类Class对象。代理类和目标类实现了同一组接口,这就说明他们大体结构都是一致的,这样我们对代理对象的操作都可以转移到目标对象身上,代理对象只需要专注于增强代码的实现。上面说了这么多其实是在引入动态代理的概念,动态代理相对于静态代理最大的区别就是不需要事先写好代理类,一般在程序的运行过程中动态产生代理类对象。动态代理实现之jdk|JDK原生提供了动态代理的实现,主要是通过java. lang. ref lect. Proxy和java. lang. ref lect InvocationHandler 这两个类配合使用。Proxy类有个静态方法,传入类加载器和一组接口就
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 手绘 彻底 动态 代理