Groovy MOP invokeMethod

时间:2013-10-25 02:13:00

标签: groovy

我试图了解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)
    ...

1 个答案:

答案 0 :(得分: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。