JDK动态代理,CGLIB以及LTW织入的区别

来源:9-7 SpringAOP的实现之CGLIB动态代理-

qq_慕瓜0195109

2020-06-30

翔仔,感觉这三种织入方式的底层原理我还是有点混淆:
我说下我的理解:
JDK动态代理:(如果理解错误麻烦纠正)
1.通过classLoader加载被代理类的class文件并获得二进制字节流
2.修改字节流,将切面逻辑织入
3.在内存中生成class对象
4.通过class对象由反射生成代理类实例

CGLIB:
我看课程好像也是修改字节码,但是和JDK的区别在哪我不是很清楚
CGLIB生成代理类实例不需要用到反射吗?
麻烦翔仔详细的解释一下

LTW:
似乎也是在类加载的时候修改了字节码生成的代理类,但是与前两者的区别在哪?

这三个织入方法的原理我已经懵了,麻烦翔仔详细的解释一下把,不然真的不太懂三者原理的区别
另外一个重要的问题就是:JDK动态代理和CGLIB是否也属于加载期织入?

或者其他有大神可以详细介绍下区别吗?

写回答

1回答

翔仔

2020-07-01

同学好,

1.JDK动态代理并不会修改被代理类的字节码,只是在程序运行的过程中生成一个代理类来替代被代理类,

  jdk动态代理的大致逻辑是

传入代理类 类加载器,与接口数组和自定义的InvocationHandler,然后通过分析接口信息生成java文件的字节码数据,然后调用本地方法将类加载到内存中,最后返回构造参数为InvocationHandler的代理类,该类实现代理接口,并继承Proxy类(所以jdk动态代理只能代理接口,java单继承),我们调用方法实际上是调用代理类的方法,代理类则可以通过我们传入的InvocationHandler反射调用原本的方法来实现无侵入的修改原有方法逻辑

2.和JDK动态代理一样,CGLIB也是在程序运行的过程中动态生成一个代理类,只是该代理类是继承自被代理类的(通过修改其字节码生成子类),而不像JDK动态代理一样实现和被代理类一样的接口。CGLIB和JDK动态代理均需要用到反射,这样才能获取到被代理类的信息

3.LTW是在类加载期进行的植入,即相比前面,直接修改的是被代理类本身,相比前面两个,它属于类加载期植入,而后两者属于运行期织入。

3
0

剑指Java自研框架,决胜Spring源码

快速入门Spring核心源码+从零开发自研框架

1498 学习 · 495 问题

查看课程