美文网首页
面试系列~动态代理实现与原理

面试系列~动态代理实现与原理

作者: _MrWhite | 来源:发表于2021-02-09 18:42 被阅读0次

    动态代理有JDK动态代理, CGLIB动态代理, SpringAOP动态代理

    一,JDK动态代理

     jdk动态代理采用的是字节码重组的方式实现的, 即重新生成一个对象来代替原来的对象, 它的实现原理如下:
      (1)通过反射获取被代理对象, 以及它的所有的接口的引用
      (2)动态生成java源代码, 在代码中加入需要增强的逻辑并且调用被代理类的方法, 同时新的类要实现被代理类实现的所有接口, 由(1)中获取的就可以编写
      (3)编译动态生成的.java文件, 从而生成.class文件
      (4)将.class文件通过ClassLoader加载到JVM中运行

    二,CGLIB动态代理

      (1)生成阶段, 把被代理类当做interface, 通过反射和类加载生成代理类
      (2)执行阶段, 当执行到methodProxy.invokeSuper()方法时, 会为代理类和被代理类各生成一个FastClass类, (一共生成了3个类, 这个过程比JDK动态代理慢 ) 并且还会为代理类和被代理类的方法分配一个index,然后将FastClass放入缓存, 下次判断不为null时直接取出来使用
      (3)把(2)中的index当做一个参数进行使用, FastClass机制就能够很快定位到要调用的方法,而不是通过反射去调用方法, 这个过程比JDK动态代理快

    CGLIB动态代理与JDK动态代理比较

      (1)JDK动态代理需被代理类实现接口, 同时代理类实现的是接口, CGLIB动态代理不需要被代理类实现任何接口, 同时代理类是继承被代理类(当然相同的方法是重写了, 调用过程是先调用被代理的方法, 然后被拦截器拦截, 然后执行super的方法)
      (2)JDK 动态代理和 CGLIB动态代理都在运行期生成字节码,但是JDK是直接写字节码, CGLIB使用的ASM框架(比较复杂我也没有研究透) 所有CGLIB动态代理生成代理类的效率比JDK动态代理慢
      (3)CGLIB动态代理使用的FastClass机制执行, 比JDK动态代理使用反射执行快一些

    三SpringAOP

      Spring就是利用以上两种动态代理原理实现的AOP
      (1)当Bean有实现接口的情况, Spring使用的是JDK动态代理来实现AOP
      (2)当Bean没有实现接口的情况, Spring使用CGLIB代理来实现AOP

    相关文章

      网友评论

          本文标题:面试系列~动态代理实现与原理

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