0

我正在尝试使用 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();
4

1 回答 1

2

看起来,如果你有一个调用,super()那么 metaClass 使用缓存来查找方法并最终抛出 StackOverflow。在这种情况下,如果您metaClass使用 A 而不是 B,则一切正常。

def mc = A.metaClass

我可以这样推断,GroovyInterceptable直接实现的类应该覆盖invokeMethod.

@Source MetaClassImpl

于 2013-06-12T17:22:00.293 回答