Groovy: 通过拦截器中的 invokeMethod 得到 StackOverflowError

Groovy: got StackOverflowError by invokeMethod within Interceptor

一个名为 InterceptorTest 的 class 实现 GroovyInterceptable,它可能是一个拦截器,它的 invokeMethod 重写如下:

class InterceptorTest implements GroovyInterceptable{
    def invokeMethod(String name,args){
        println "intercepting call! " //println a short message
    }
}

我认为 class InterceptorTest 作为拦截器会将所有方法调用委托给 invokeMethod,因此以下内容应该有效:

def interceptor=new InterceptorTest()
println interceptor.work()

不幸的是,我得到了一个 WhosebugError,似乎在 invokeMethod 的主体,但我不知道为什么会发生。

作为对口,我改变了函数体,不是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!"

但是为什么?

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

We cannot use default groovy methods like println because these methods are injected into all Groovy objects so they will be intercepted too.