用于选择性类或方法的Java CGlib Enhancer

时间:2015-09-14 18:21:43

标签: java spring cglib

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

还可以说我有以下代码

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

我想只截取方法m1()和m3()。是否有可能,如果是的话怎么做?

1 个答案:

答案 0 :(得分:0)

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