覆盖您在Groovy中不拥有的类的toString

时间:2017-07-22 15:22:47

标签: groovy

我正在使用一个带有Spring Social的小型Groovy应用程序来使用来自Twitter的流。我现在想记录我收到的每条推文,包括一些细节。

如果Tweet类在我自己的代码中,我可以很容易地做到这一点来获得一个不错的日志输出:

import groovy.transform.ToString

@ToString
class Tweet {
    // fields...
}

但是因为我要记录的课程是在Spring Social中,所以我不能这样做。是否存在覆盖toString方法的“Groovy”方式?

toString添加metaClass关闭并没有多大帮助,因为我不想在每个日志输出中显式调用toString

org.springframework.social.twitter.api.Tweet.metaClass.toString = {
    "${delegate.field1}, ${delegate.field2}"
}

// still prints "received tweet [org.springframework.social.twitter.api.Tweet@637c1991]"
log.info("received tweet [{}]", tweet) 

// prints "received tweet [field1 field]"
log.info("received tweet [{}]", tweet.toString())

1 个答案:

答案 0 :(得分:1)

是的,你可以这样做。 Groovy有能力使用metaClass功能向现有类注入新方法。当您在类上调用方法时,将检查所谓的元类注册表,以查看该类实例是否存在metaClass扩展方法。

只需定义:

Tweet.metaClass.toString = {"${delegate.field}, ${delegate.anotherField}"}