【问题标题】:Groovy: got StackOverflowError by invokeMethod within InterceptorGroovy:通过 Interceptor 中的 invokeMethod 得到 StackOverflowError
【发布时间】:2017-10-14 07:36:37
【问题描述】:

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

但是为什么?

【问题讨论】:

    标签: groovy metaprogramming


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      相关资源
      最近更新 更多