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还有不少的选项,对我个人而言,其实默认的就足够了,就偷懒只写一下介绍了

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的值缓存起来
     

 

 

好了,就这么多了,休息,休息一下

posted @ 2016-02-04 15:56  灰色逻辑  阅读(1478)  评论(0编辑  收藏  举报