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

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

作者: _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

相关文章

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

    动态代理有JDK动态代理, CGLIB动态代理, SpringAOP动态代理 一,JDK动态代理  jdk动态代理...

  • Java动态代理和CGLIB动态代理

    面试中被问到spring aop的实现原理,说了动态代理,面试关接着问动态代理的原理是什么。。。一脸懵逼,自己还是...

  • AOP——cglib动态代理源码解析

    上一篇分析了使用JDK动态代理的低层实现原理,这次再来看看cglib实现动态代理的原理。 关于JDK动态代理的实现...

  • java 动态代理

    动态代理模式介绍 实现原理 设计动态代理类(DynamicProxy)时,不需要显式实现与目标对象类(RealSu...

  • java 动态代理详解

    面试中多次遇到动态代理题目,今日小结 原理区别1 java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调...

  • 动态代理(二)

    动态代理的原理 我们可以看到动态代理是根据反射实现的,那么我们可以自己实现动态代理吗? 1、每个动态代理的类都实现...

  • (京东面试题)java动态代理主要怎么实现的,spring ao

    京东面试题 1、java动态代理主要怎么实现的,spring aop 原理 如下类 如何实现在方法example ...

  • 动态代理-jdk代理实现原理

    动态代理-jdk代理实现原理 JDK中提供了一个Proxy类用于实现动态代理,JDK的动态代理是基于接口实现的,被...

  • Spring AOP 实现原理

    Spring AOP 实现原理 静态代理 众所周知 Spring 的 AOP 是基于动态代理实现的,谈到动态代理就...

  • 动态代理

    目录: 1.动态代理与静态代理的使用区别2.动态代理实现原理3.动态代理的使用场景 1.静态代理 代理模式给某一个...

网友评论

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

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