一个名为InterceptorTest
的实现GroovyInterceptable
的类,可能是一个拦截器,其invokeMethod
覆盖如下:
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()
不幸的是,我得到了一个StackOverflowError,似乎在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!"
但为什么?
答案 0 :(得分:1)
根据the documentation,“println”实际上是类中的一个方法,由Groovy注入。因此,您可以通过尝试在invokeMethod函数中调用它来实现无限递归。
我们不能使用像 println 这样的默认groovy方法,因为这些方法会被注入到所有Groovy对象中,因此它们也会被截获。