美文网首页
手写一个动态代理框架

手写一个动态代理框架

作者: __晨风__ | 来源:发表于2020-06-07 11:48 被阅读0次

    手写一个动态代理框架

    一:代理认知

    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-晨风

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

    图2-晨风

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

    图3-晨风

    四、动态代理

    图4-晨风

             4.1jdk的动态代理实现

    图5-晨风

             4.2cglib的动态代理实现

              4.2.1依赖cglib包

    图6-晨风

             4.2.2

    图7-晨风

    五、手动实现动态代理

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

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

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

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

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

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

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

             核心代码如下:

    图8-晨风

    六、总结

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

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

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

    相关文章

      网友评论

          本文标题:手写一个动态代理框架

          本文链接:https://www.haomeiwen.com/subject/kixctktx.html