用于选择性类或方法的 Java CGlib 增强器

标签 java spring cglib

我想开发一个实用类来拦截我的项目的一些方法。目前我的项目有 120 多个 java 文件,我想拦截 10 个文件中的 15 个方法。如何使用 Cglib 增强器实现这一点?

还可以说我有以下代码

class A{
 B b = new B();
 C c = new C():
 void m1(){
   b.m2();
   c.m3();
 }
}

我只想拦截方法 m1() 和 m3()。是否可能,如果可以,该怎么做?

最佳答案

Cglib 的工作原理是在运行时为您的类型创建子类。因此,使用 cglib 不可能实现您的建议。对于您的类 A,cglib 的 Enhancer 创建一个类似于以下内容的类:

class A$Proxy extends A {

  MethodInterceptor interceptor;

  @Override
  void m1(){
    interceptor.intercept("m1");  
  }
}

这样,cglib 就可以调用您的代码而不是原始实现。但是,A 类的字段实例不是虚拟的,并且由于子类化方法而无法由 cglib 修改。使用 cglib,实际上不会更改现有代码。

相反,您应该考虑使用 Java 代理,它允许您重新定义现有代码,以实现您正在寻找的 AOP 编程风格。有些库比 cglib 更强大,例如 Byte Buddy ,我写的一个库。如果您有兴趣,我曾经在 Byte Buddy 的日志记录示例中写过此类 AOP 的示例:http://mydailyjava.blogspot.no/2015/01/make-agents-not-frameworks.html

关于用于选择性类或方法的 Java CGlib 增强器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32571420/

相关文章:

java - 使 MessageBodyWriter 不消耗资源类并返回资源一中的子资源类

java - Spring 和 MongoDB Atlas 在 5 分钟不活动后中断连接

java - 如何确保 Flyway 在我的 bean 之前加载?

java - Hibernate envers 获取修订日志

java - 我的 Java 书显示正在创建两个相同的对象,但它们未能通过 Object.equals() 调用。为什么?

Javascript 继续或取消提交按钮

java - 使用 webjars 进行 r.js 压缩

java - Spring Batch @StepScope 无法生成 CGLIB 子类

java - CGLib - 创建一个带有一些字段的 bean 并在它们上面放置注释?