当前位置:网站首页 > 技术博客 > 正文

强制开启cglib代理



关注公众号 不爱总结的麦穗 将不定期推送技术好文

如果想了解JDK动态代理可以看我这篇文章:彻底搞懂JDK动态代理

CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它扩展了Java的字节码操作框架ASM,提供了更加方便的API。CGLIB主要用于动态生成类和代理类,常用于实现AOP(面向切面编程)编程。

CGLIB是针对类实现代理,主要是对指定的类生成一个子类(),覆盖其中的方法。

1.定义CGLIB代理的目标类

 

2.实现MethodInterceptor接口,重写intercept方法

 是一个接口,它定义了方法拦截器应该实现的方法。

 

接口只有一个方法,即方法,它负责处理对代理对象的方法调用。

对比JDK动态代理实现的接口,看到都实现了对应的接口,重写了里面的方法。 区别在于:,后面的内容我们会说到为什么不建议

3.通过Enhancer类创建动态代理对象

类是CGLIB中的一个类,既能够代理普通的class,也能够代理接口(JDK中的只能代理接口)

类主要用到的方法:

  • 用来设置代理类的父类,即需要给哪个类创建代理类
  • 传递的是接口类型的参数,这个接口的方法会拦截代理对象所有的方法调用。
  • 顾名思义 传递的是接口类型的参数数组
  • 设置回调选择器,我们通过可以实现不同的方法使用不同的回调方法
  • 方法获取代理对象
 

image.png

image.png

通过 获取到代理接口的 image.png

方法Debug后发现最后还是通过反射生成代理对象() image.png

通过Arthas反编译的源码,可以看到该类继承了目标接口 (ps:也可以通过下面的代码将生成类写入文件中)

 

image.png

从上面源码我们可以看到子类重写了父类的方法,调用了方法,从而完成了由代理对象访问到目标对象的动态代理实现。

查看我们的文件夹,我们发现CGLIB除了生成代理对象类,还生成了两个FastClass类( FastClass f1,f2)(JDK动态代理只会生成一个代理类),代理类我们很容易理解,但这两个FastClass类用什么用呢?

image.png

CGLIB采用FastClass机制,对代理类和目标类的方法建立签名hash映射,这样就可以直接调用,避免了反射调用目标类(JDK动态代理只能采用反射调用目标类)

CGLIB中我们使用方法调用目标方法,通过的类的源码,发现其内部保存着对它们的引用

image.png

简单来说,多出来的这两个FastClass的作用是:

FastClass-f1:目标类(被代理对象)的映射,所有方法都转发到目标类

FastClass-f2:代理类的映射,所有方法都转发到代理类

在我们调用方法时,实际是直接利用 FastClass-f2 去调用的代理类,避免了反射调用。

CGLIB代理目标可以不实现接口

CGLIB是针对类实现代理,生成一个之类,所以该类或方法最好不要声明成final, static方法,private方法,final方法是不能被代理的

screenshot-20240417-103455.png

版权声明


相关文章:

  • 敏捷开发的核心思想是什么2024-11-19 20:01:04
  • debian smb服务2024-11-19 20:01:04
  • 0-1背包问题动态规划算法2024-11-19 20:01:04
  • rownum的使用2024-11-19 20:01:04
  • tinyxml2中文指南2024-11-19 20:01:04
  • 荃优399水稻品种简介2024-11-19 20:01:04
  • 班知达藏文输入法2024-11-19 20:01:04
  • centos版本越高越好吗2024-11-19 20:01:04
  • green 数据库2024-11-19 20:01:04
  • pycharm中出现no module named2024-11-19 20:01:04