首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy: println与System.out.println的GroovyInterceptable

Groovy: println与System.out.println的GroovyInterceptable
EN

Stack Overflow用户
提问于 2015-06-04 14:39:31
回答 1查看 50.1K关注 0票数 12

当我使用System.out.println时,为什么需要使用GroovyInterceptable而不是println

例如,如果我在Groovy文件中编码,我可以通过键入以下命令将其打印到控制台:

代码语言:javascript
复制
println "Printing to Console"

但如果我想在这里打印:

代码语言:javascript
复制
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中是否还有其他类实现会出现这个问题呢?

EN

回答 1

Stack Overflow用户

发布于 2015-06-04 15:07:24

这是因为您的类Test实现了GroovyInterceptable接口,根据文档,它是

用于通知应通过invokeMethod机制GroovyObject截获所有方法。

这不仅仅是在类中定义的方法。尝试:

代码语言:javascript
复制
test?.total(2,3)

你会看到它回来了

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

因此,对println is invokeMethod的调用被理解为对this.println的调用,就像对sum的调用一样。但是this.println只是再次调用invokeMethod,因为您实现了GroovyInterceptable,等等。

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

代码语言:javascript
复制
class Test {
    def sum(Integer x, Integer y) { 
        println "Let's sum!"
        x + y
    }
}

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

威尔输出

我们来总结一下!

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30646899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档