Groovy:使用GroovyInterceptable的println vs System.out.println

时间:2015-06-04 14:39:32

标签: groovy

当我使用System.out.println时,为什么需要使用println代替GroovyInterceptable

例如,如果我在Groovy文件中编码,我只需键入以下内容即可打印到控制台:

println "Printing to Console"

但如果我想在这里打印:

class Test implements GroovyInterceptable {
    def sum(Integer x, Integer y) { x + y }

    def invokeMethod(String name, args) {
        System.out.println "Invoke method $name with args: $args"
    }
}

def test = new Test()
test?.sum(2,3)

我必须在该方法中使用System.out.println,否则我会得到StackOverflowError。为什么呢?

更新: 感谢@Dan Getz提供的答案,我知道为什么现在GroovyInterceptable课程会发生这种情况。有谁知道Groovy中是否有其他类实现可能会出现此问题?

1 个答案:

答案 0 :(得分:4)

这是因为您的班级Test实现了GroovyInterceptable界面,根据文档,该界面是

  

用于通知所有方法都应通过invokeMethod的{​​{1}}机制拦截。

这不仅仅是您班上定义的方法。尝试:

GroovyObject

您会看到它返回

  

使用args调用方法总计:[2,3]

test?.total(2,3) println的来电被理解为对invokeMethod的调用,就像调用this.println一样。但sum只是再次调用this.println,因为您实施了invokeMethod,依此类推。

如果你没有实施GroovyInterceptable,就不会发生这种情况。例如,运行以下代码

GroovyInterceptable

将输出

  

让我们的总和!