Java 选择性 class 或方法的 CGlib 增强器
Java CGlib Enhancer for Selective class or method
我想开发一个实用程序 class 来拦截我项目的一些方法。目前我的项目有 120+ java 个文件,我想拦截 10 个文件中的 15 个方法。如何使用 Cglib 增强器实现?
也可以说我有以下代码
class A{
B b = new B();
C c = new C():
void m1(){
b.m2();
c.m3();
}
}
我只想拦截方法 m1() 和 m3()。可以吗,如果可以怎么办?
Cglib 通过在运行时为您的类型创建子classes 来工作。因此,您的建议不可能使用 cglib。对于您的 class A
,cglib 的 Enhancer
创建一个 class 类似于:
class A$Proxy extends A {
MethodInterceptor interceptor;
@Override
void m1(){
interceptor.intercept("m1");
}
}
这样,cglib 就可以调用您的代码,而不是原来的实现。但是,A
class 的字段实例不是虚拟的,并且由于 subclassing 方法不能被 cglib 修改。使用 cglib,实际上没有更改现有代码。
相反,您应该考虑使用 Java 代理,它允许您重新定义现有代码,从而实现您正在寻找的 AOP 编程风格。有比 cglib 更强大的库,例如 Byte Buddy, a library that I wrote. I once wrote down an example for such AOP with Byte Buddy on the example of logging if you are interested: http://mydailyjava.blogspot.no/2015/01/make-agents-not-frameworks.html
我想开发一个实用程序 class 来拦截我项目的一些方法。目前我的项目有 120+ java 个文件,我想拦截 10 个文件中的 15 个方法。如何使用 Cglib 增强器实现?
也可以说我有以下代码
class A{
B b = new B();
C c = new C():
void m1(){
b.m2();
c.m3();
}
}
我只想拦截方法 m1() 和 m3()。可以吗,如果可以怎么办?
Cglib 通过在运行时为您的类型创建子classes 来工作。因此,您的建议不可能使用 cglib。对于您的 class A
,cglib 的 Enhancer
创建一个 class 类似于:
class A$Proxy extends A {
MethodInterceptor interceptor;
@Override
void m1(){
interceptor.intercept("m1");
}
}
这样,cglib 就可以调用您的代码,而不是原来的实现。但是,A
class 的字段实例不是虚拟的,并且由于 subclassing 方法不能被 cglib 修改。使用 cglib,实际上没有更改现有代码。
相反,您应该考虑使用 Java 代理,它允许您重新定义现有代码,从而实现您正在寻找的 AOP 编程风格。有比 cglib 更强大的库,例如 Byte Buddy, a library that I wrote. I once wrote down an example for such AOP with Byte Buddy on the example of logging if you are interested: http://mydailyjava.blogspot.no/2015/01/make-agents-not-frameworks.html