繼續上一篇:Groovy中那些神奇註解之Memoizedhtml
這篇就講講@groovy.transform.ToString這個註解,這注解太熟悉了,熟悉到讓人一看就知道是幹嘛的,不就是把Bean轉在String麼?java
沒錯,它就是把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,一下知足我所有需求啊app
若是要想看看註解作了啥,把代碼複製到GroovyConsole中,而後點擊菜單Script->Inspect AST,就能看到最終生成的Groovy代碼是怎樣的了ui
如下是展開的Book類:this
@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還有很多的選項,對我我的而言,其實默認的就足夠了,就偷懶只寫一下介紹了debug
選項名 | 默認值 | 說明 |
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的值緩存起來 |
好了,就這麼多了,休息,休息一下code