当我使用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中是否有其他类实现可能会出现此问题?
答案 0 :(得分:4)
这是因为您的班级Test
实现了GroovyInterceptable
界面,根据文档,该界面是
用于通知所有方法都应通过
invokeMethod
的{{1}}机制拦截。
这不仅仅是您班上定义的方法。尝试:
GroovyObject
您会看到它返回
使用args调用方法总计:[2,3]
test?.total(2,3)
内println
的来电被理解为对invokeMethod
的调用,就像调用this.println
一样。但sum
只是再次调用this.println
,因为您实施了invokeMethod
,依此类推。
如果你没有实施GroovyInterceptable
,就不会发生这种情况。例如,运行以下代码
GroovyInterceptable
将输出
让我们的总和!