请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

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

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

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

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

正在回答 回答被采纳积分+3

1回答

翔仔 2020-07-01 00:01:42

同学好,

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

  jdk动态代理的大致逻辑是

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

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

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

3 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信