Groovy中那些神奇注解之ToString
继续上一篇:Groovy中那些神奇注解之Memoized
这篇就讲讲@groovy.transform.ToString这个注解,这注解太熟悉了,熟悉到让人一看就知道是干吗的,不就是把Bean转在String么?
没错,它就是把Bean转成String,只不过比Java默认的类名加上HashCode可是好太多了,来个例子(Groovy自带了dump()和inspect()方法,也是查看对象的,写在一起做比较了)
@groovy.transform.ToString class Book{ def name def price } def book = new Book(name:"Groovy In Action", price: 68) println book println book.dump() println book.inspect() /* 结果如下: Book(Groovy In Action, 68) <Book@41067f0a name=Groovy In Action price=68> Book(Groovy In Action, 68) */
怎么样,感觉不错吧,想到以前为了看个Bean的值 ,要么debug,要么写System.out.println,现在有了ToString,一下满足我全部需求啊
如果要想看看注解做了啥,把代码复制到GroovyConsole中,然后点击菜单Script->Inspect AST,就能看到最终生成的Groovy代码是怎样的了
以下是展开的Book类:
@groovy.transform.ToString public class Book implements groovy.lang.GroovyObject extends java.lang.Object { private java.lang.Object name private java.lang.Object price private static org.codehaus.groovy.reflection.ClassInfo $staticClassInfo public static transient boolean __$stMC private transient groovy.lang.MetaClass metaClass public Book() { metaClass = /*BytecodeExpression*/ } public java.lang.String toString() { java.lang.Object _result = new java.lang.StringBuilder() java.lang.Object $toStringFirst = true _result.append('Book(') if ( $toStringFirst ) { $toStringFirst = false } else { _result.append(', ') } if (this.getName().is(this)) { _result.append('(this)') } else { _result.append(org.codehaus.groovy.runtime.InvokerHelper.toString(this.getName())) } if ( $toStringFirst ) { $toStringFirst = false } else { _result.append(', ') } if (this.getPrice().is(this)) { _result.append('(this)') } else { _result.append(org.codehaus.groovy.runtime.InvokerHelper.toString(this.getPrice())) } _result.append(')') return _result.toString() } protected groovy.lang.MetaClass $getStaticMetaClass() { } public groovy.lang.MetaClass getMetaClass() { } public void setMetaClass(groovy.lang.MetaClass mc) { } public java.lang.Object invokeMethod(java.lang.String method, java.lang.Object arguments) { } public java.lang.Object getProperty(java.lang.String property) { } public void setProperty(java.lang.String property, java.lang.Object value) { } public java.lang.Object getName() { } public void setName(java.lang.Object value) { } public java.lang.Object getPrice() { } public void setPrice(java.lang.Object value) { } public java.lang.String super$1$toString() { } }
ToString还有不少的选项,对我个人而言,其实默认的就足够了,就偷懒只写一下介绍了
选项名 | 默认值 | 说明 |
includeNames | false | 显示的时候是否带上属性的名称,比如name=Groovy In Action |
excludes | 空 | 哪些属性不显示 |
includes | 空 | 要显示哪些属性 |
includeSuper | false | 是否显示父类的ToString效果 |
includeSuperProperties | false | 是否显示父类的属性 |
includeFields | false | 是否显示类字段(比如private字段, public的会自动转成属性) |
ignoreNulls | false | 是否忽略NULL值 |
includePackage | false | 类名是否包含包名 |
cache | false | 是否把ToString的值缓存起来 |
好了,就这么多了,休息,休息一下