1

我试图了解 invokeMethod 如何拦截 Groovy 中的方法调用。不过,我似乎无法获得最基本的示例。

class Person implements GroovyInterceptable {

    def invokeMethod(String name,args) {
        println "called invokeMethod $name $args"
    }

    def greet() {
        println "Hello from greet()"
    }

}

def p = new Person()
p.greet()

如果我尝试运行此示例,则会收到以下错误。我错过了什么?

Caught: java.lang.StackOverflowError
java.lang.StackOverflowError
    at Person.invokeMethod(Person.groovy:4)
    at Person.invokeMethod(Person.groovy:4)
    at Person.invokeMethod(Person.groovy:4)
    ...
4

1 回答 1

1

您需要invokeMethod在拦截后调用实际方法。

class Person implements GroovyInterceptable {
    def invokeMethod(String name,args) {
        System.out.println "called invokeMethod $name $args"
        metaClass.getMetaMethod(name, args).invoke(this, args)
    }

    def greet() {
        System.out.println "Hello from greet()"
    }
}

def p = new Person()
p.greet()

是的,你是正确的println。必须使用SOP。

于 2013-10-25T13:29:19.820 回答