2017-10-14 137 views
1

得到的StackOverflowError通過invokeMethod中名爲InterceptorTest實施GroovyInterceptable,A級,這可能是一個攔截器,有其invokeMethod overrided如下:Groovy的:內攔截

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,看似在身體,但我不知道爲什麼發生。

作爲對手,我改變了函數體,不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!" 

但爲什麼呢?

回答

1

根據the documentation,「println」實際上是類中的一個方法,由Groovy注入。因此,您可以通過在invokeMethod函數內調用它來實現無限遞歸。

,因爲這些方法都注入到所有的Groovy對象,所以他們也將被攔截,我們不能使用默認的常規方法,如的println