Groovy:在拦截器中通过invokeMethod获得StackOverflowerError

Groovy:在拦截器中通过invokeMethod获得StackOverflowerError,groovy,metaprogramming,Groovy,Metaprogramming,名为InterceptorTest的类实现了GroovyInterceptable,它可以是一个拦截器,其调用方法被覆盖如下: class InterceptorTest implements GroovyInterceptable{ def invokeMethod(String name,args){ println "intercepting call! " //println a short message } } 我认为类InterceptorTest

名为
InterceptorTest
的类实现了
GroovyInterceptable
,它可以是一个拦截器,其
调用方法被覆盖如下:

class InterceptorTest implements GroovyInterceptable{
    def invokeMethod(String name,args){
        println "intercepting call! " //println a short message
    }
}
我认为类
InterceptorTest
是一个拦截器,它会将所有方法调用委托给
invokeMethod
,因此下面应该可以工作:

def interceptor=new InterceptorTest()
println interceptor.work()
不幸的是,我在
invokeMethod
的主体中发现了一个StackOverflower错误,但我不知道为什么会发生

作为对应项,我更改了函数体,不是
println
,而是
return
消息:

class InterceptorTest implements GroovyInterceptable{
    def invokeMethod(String name,args){
        "intercepting call! " //return a short message
    }
}
然后它工作得很好:

def interceptor=new InterceptorTest()
println interceptor.work()  //get "intercepting call!"
但是为什么呢?

根据Groovy的说法,“println”实际上是类中的一个方法,由Groovy注入。因此,您可以通过尝试在invokeMethod函数中调用它来实现无限递归

我们不能使用默认的groovy方法,比如println,因为这些方法被注入到所有groovy对象中,所以它们也会被拦截