当我使用System.out.println时,为什么需要使用GroovyInterceptable而不是println
例如,如果我在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给出的答案,我知道为什么现在GroovyInterceptable类会出现这种情况。有谁知道Groovy中是否还有其他类实现会出现这个问题呢?
发布于 2015-06-04 15:07:24
这是因为您的类Test实现了GroovyInterceptable接口,根据文档,它是
用于通知应通过
invokeMethod机制GroovyObject截获所有方法。
这不仅仅是在类中定义的方法。尝试:
test?.total(2,3)你会看到它回来了
使用args: 2,3调用方法总计
因此,对println is invokeMethod的调用被理解为对this.println的调用,就像对sum的调用一样。但是this.println只是再次调用invokeMethod,因为您实现了GroovyInterceptable,等等。
如果不实现GroovyInterceptable,就不会发生这种情况。例如,运行以下代码
class Test {
def sum(Integer x, Integer y) {
println "Let's sum!"
x + y
}
}
def test = new Test()
test?.sum(2,3)威尔输出
我们来总结一下!
https://stackoverflow.com/questions/30646899
复制相似问题