关注公众号 不爱总结的麦穗 将不定期推送技术好文
如果想了解JDK动态代理可以看我这篇文章:彻底搞懂JDK动态代理
CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它扩展了Java的字节码操作框架ASM,提供了更加方便的API。CGLIB主要用于动态生成类和代理类,常用于实现AOP(面向切面编程)编程。
CGLIB是针对类实现代理,主要是对指定的类生成一个子类(),覆盖其中的方法。
1.定义CGLIB代理的目标类
2.实现MethodInterceptor接口,重写intercept方法
是一个接口,它定义了方法拦截器应该实现的方法。
接口只有一个方法,即方法,它负责处理对代理对象的方法调用。
对比JDK动态代理实现的接口,看到都实现了对应的接口,重写了里面的方法。 区别在于:,后面的内容我们会说到为什么不建议
3.通过Enhancer类创建动态代理对象
类是CGLIB中的一个类,既能够代理普通的class,也能够代理接口(JDK中的只能代理接口)
类主要用到的方法:
- 用来设置代理类的父类,即需要给哪个类创建代理类
- 传递的是接口类型的参数,这个接口的方法会拦截代理对象所有的方法调用。
- 顾名思义 传递的是接口类型的参数数组
- 设置回调选择器,我们通过可以实现不同的方法使用不同的回调方法
- 方法获取代理对象
通过 获取到代理接口的
方法Debug后发现最后还是通过反射生成代理对象()
通过Arthas反编译的源码,可以看到该类继承了目标接口 (ps:也可以通过下面的代码将生成类写入文件中)
从上面源码我们可以看到子类重写了父类的方法,调用了方法,从而完成了由代理对象访问到目标对象的动态代理实现。
查看我们的文件夹,我们发现CGLIB除了生成代理对象类,还生成了两个FastClass类( FastClass f1,f2)(JDK动态代理只会生成一个代理类),代理类我们很容易理解,但这两个FastClass类用什么用呢?
CGLIB采用FastClass机制,对代理类和目标类的方法建立签名hash映射,这样就可以直接调用,避免了反射调用目标类(JDK动态代理只能采用反射调用目标类)
CGLIB中我们使用方法调用目标方法,通过的类的源码,发现其内部保存着对它们的引用
简单来说,多出来的这两个FastClass的作用是:
FastClass-f1:目标类(被代理对象)的映射,所有方法都转发到目标类
FastClass-f2:代理类的映射,所有方法都转发到代理类
在我们调用方法时,实际是直接利用 FastClass-f2 去调用的代理类,避免了反射调用。
CGLIB代理目标可以不实现接口
CGLIB是针对类实现代理,生成一个之类,所以该类或方法最好不要声明成final, static方法,private方法,final方法是不能被代理的
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/10269.html