重写Groovy中不属于您的类的toString

重写Groovy中不属于您的类的toString,groovy,Groovy,我正在使用SpringSocial的一个小Groovy应用程序来使用来自Twitter的流。我现在想记录我收到的每一条推特,包括一些细节 如果Tweet类在我自己的代码中,我可以轻松地这样做以获得一个好的日志输出: import groovy.transform.ToString @ToString class Tweet { // fields... } 但是因为我想记录的类是在Spring Social中,所以我不能这么做。是否有一种“Groovy”方法重写toString方法

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

如果
Tweet
类在我自己的代码中,我可以轻松地这样做以获得一个好的日志输出:

import groovy.transform.ToString

@ToString
class Tweet {
    // fields...
}
但是因为我想记录的类是在Spring Social中,所以我不能这么做。是否有一种“Groovy”方法重写
toString
方法

元类中添加
toString
闭包实际上没有帮助,因为我不想在每次日志输出时显式调用
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())

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

简单定义:


Tweet.metaClass.toString={“${delegate.field},${delegate.anotherField}}
Tweet.metaClass.toString={“$delegate.field1$delegate.field2”}
?一般来说,我会避免这样做,因为很难找到,很难找到正确的位置,如果从Java调用代码,也不会工作。您必须拥有包含一个或多个
Tweet
实例的内容?为什么不在那里使用toString方法呢?@tim_yates没错,如果我有选择的话,我会选择decorator,这绝对是一个更干净的解决方案。在元类中添加toString闭包没有帮助,因为我必须在每次日志输出时显式调用
toString
log.info(“received tweet[$tweet]”怎么办
这对日志输出不起作用,我更新了这个问题。我担心,如果Tweet是一个Java而不是Groovy类,那么这就是您所能做到的。看看groovy文档或者这个主题:不完全正确。如果从groovy调用,它将工作,但如果从Java调用,则不会工作。因此,只要您登录groovy类,就可以了。如果一个Java类正在记录日志,它不会work@tim_yates谢谢分享,我不知道:)