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.
一个名为 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.