我正在尝试使用Groovy AOP方法增强我的Grails项目。但是,如果我用一个闭包覆盖invokeMethod,我总是得到StackOverflowError。这是我的测试代码,我可以用groovy 2.1.3重现错误,谢谢!
class A implements GroovyInterceptable
{
void foo(){
System.out.println( "A.foo");
}
}
class B extends A
{
void foo(){
System.out.println( "B.foo");
super.foo();
}
}
def mc = B.metaClass;
mc.invokeMethod = { String name, args ->
// do "before" and/or "around" work here
try {
def value = mc.getMetaMethod(name, args).invoke(delegate, args)
// do "after" work here
return value // or another value
}
catch (e) {
// do "after-throwing" work here
}
}
B b = new B();
b.foo();
答案 0 :(得分:2)
看起来,如果您调用super()
,那么metaClass会使用缓存来查找方法并最终抛出StackOverflow。在这种情况下,如果你metaClass
A而不是B,那一切都可以。
def mc = A.metaClass
我可以这样推断,直接实施GroovyInterceptable
的类应覆盖invokeMethod
。
@Source MetaClassImpl