Groovy MOP调用方法

Groovy MOP调用方法,groovy,Groovy,我试图理解invokeMethod如何在Groovy中拦截方法调用。不过,我似乎无法让最基本的例子发挥作用 class Person implements GroovyInterceptable { def invokeMethod(String name,args) { println "called invokeMethod $name $args" } def greet() { println "Hello from greet

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

截取后,需要从
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

在拦截之后,您需要从
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

println是Groovy对象上的一个方法,它被捕获,因此将我发送到一个无限循环中。使用System.out.println(不受我们的拦截点影响)修复了该问题。感谢Venkat(编程Groovy 2),println是Groovy对象上的一个方法,它被捕获了,因此将我送入了一个无限循环。使用System.out.println(不受我们的拦截点影响)修复了该问题。感谢Venkat(编程Groovy 2)