2017-10-14 3 views
1

内には、invokeMethodによってStackOverflowErrorが迎撃可能性がありInterceptorTestGroovyInterceptableを実装するというクラス、次のようにそのinvokeMethodがオーバーライドしていました:な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のようなデフォルトのグルーヴィーな方法を使用することはできません。