手写一个动态代理框架

手写一个动态代理框架

一:代理认知

1、在JAVA里什么是动态代理?

个人理解:这里的动态代理首先要明确代理的对象是什么,当然是代理类。

2、代理类能干什么?

首先类具有什么,无非就是属性和方法,代理属性没多大意义,所以必然是代理类方法。

3、为什么需要代理方法,直接调用不更好么?

当然不是,通常我们想去调用目标类A的方法method(),我们并非是直接调用,而是需要添加一些逻辑,同时又去调用A.method()。

4、直接在A方法里改不行么?

肯定不行,如果A.method()方法此时已经被许多地方调用,直接修改method(),势必会带来不可控的风险。所以我们对A.method()进行封装,这里我们常用的技术手段有:装饰器模式、代理模式等

二、在java中代理类的方式有哪些:静态代理(staticProxy)、动态代理(dynamicProxy)

2.1:动态代理又有:jdk里的Proxy.newProxyInstance,通过method.invoke来去调用真正的A.method().

2.2: 其次动态代理的另外一种实现方式:cglib,其中cglib提供了Enhancer和MethodProxy.invokeSuper来实现

         这里需要说明的是:cglib并非是jdk提供的

三、静态代理

手写一个动态代理框架_第1张图片
图1-晨风

         3.1静态代理实现方式一:继承目标类

手写一个动态代理框架_第2张图片
图2-晨风

         3.2静态代理实现方式二:通过实现目标接口

手写一个动态代理框架_第3张图片
图3-晨风

四、动态代理

手写一个动态代理框架_第4张图片
图4-晨风

         4.1jdk的动态代理实现

手写一个动态代理框架_第5张图片
图5-晨风

         4.2cglib的动态代理实现

          4.2.1依赖cglib包

图6-晨风

         4.2.2

手写一个动态代理框架_第6张图片
图7-晨风

五、手动实现动态代理

         这里我们实现的思路如下:

         5.1先去写一个java 文件的字符串

         5.2然后通过代码生成指定路径下的.java文件

         5.3通过jdk为我们提供的JavaComplier来生成.class文件

         5.4再通过ClassLoader将.class文件加载到jvm当中,并返回一个class对象

         5.5最后通过反射class对象生成我们的代理类的实例对象

这里实现了一个自定义的ClassLoader

         核心代码如下:

手写一个动态代理框架_第7张图片
图8-晨风

六、总结

         说了这么多,代理到底能干什么?

         说白了其实就是对目标方法进行增强,满足新的业务需要。

         为什么动态代理又独受恩宠,因为静态代理会让我们的代码冗余非常多,如果我们需要对上千个接口进行增强,那么代理类的数量和目标类的比例为1:1.所以才出现了动态代理,在这里动态代理会为我们省去大量的冗余代码

你可能感兴趣的:(手写一个动态代理框架)