Groovy:拦截器

时间:2017-10-14 07:36:37

标签: groovy metaprogramming

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

但为什么?

1 个答案:

答案 0 :(得分:1)

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

  

我们不能使用像 println 这样的默认groovy方法,因为这些方法会被注入到所有Groovy对象中,因此它们也会被截获。