继续上一篇: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的值缓存起来
     

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

Groovy中那些神奇注解之ToString的更多相关文章

  1. Groovy中那些神奇注解之InheritConstructors

    上一篇:Groovy中那些神奇注解之ToString 写完ToString,本来想今天就写到这了,突然觉得InheritConstructors注解实在也是个神器,写起来也没多少字,还是写了吧. In ...

  2. Groovy中那些神奇注解之Memoized

    临近年关手头比较闲,去看了一下Groovy的官方文档,才发现原来Groovy中带了那么多的注解,很多注解带来的效果,有时候让人感觉“这不是在变魔法吧”. 个人很喜欢Groovy,写不成Ruby,Gro ...

  3. Mybatis中的@SelectKey注解

    一.创建Maven项目 在pom.xml中,添加mybatis依赖,mysql-jdbc依赖,把编译版本改为1.8 你问,为啥mybatis不会自动依赖mysql-jdbc,需要手动写明?答:因为my ...

  4. 深入理解spring中的各种注解

    Spring中的注解大概可以分为两大类: 1)spring的bean容器相关的注解,或者说bean工厂相关的注解: 2)springmvc相关的注解. spring的bean容器相关的注解,先后有:@ ...

  5. 深入理解spring中的各种注解(转)

    Spring中的注解大概可以分为两大类: 1)spring的bean容器相关的注解,或者说bean工厂相关的注解: 2)springmvc相关的注解. spring的bean容器相关的注解,先后有:@ ...

  6. 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  7. Groovy中的闭包

    Closures(闭包) 本节主要讲groovy中的一个核心语法:closurs,也叫闭包.闭包在groovy中是一个处于代码上下文中的开放的,匿名代码块.它可以访问到其外部的变量或方法. 1. 句法 ...

  8. 第5章—构建Spring Web应用程序—关于spring中的validate注解后台校验的解析

    关于spring中的validate注解后台校验的解析 在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判 ...

  9. Groovy中的面向对象

    Groovy中的面向对象 前面说到groovy支持脚本和类,前面一节已将简单说了脚本和类之间的关系,这一节主要介绍一下groovy中类的相关知识,即面向对象相关知识. 1.类型 1.1 原始类型 gr ...

随机推荐

  1. SSH整合,applicationContext.xml中配置hibernate映射文件问题

    今天在applicationContext.xml中配置sessionFactory时遇到了各种头疼的问题,现在总结一下: 1.<property name="mappingDirec ...

  2. 【JQ成长笔记】jQuery Validate验证插件

    validate是一款很好的jq插件,提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证,同 ...

  3. Ajax访问PHP页面出现的跨域问题

    1.跨域问题:简单来说就是A域名下的程序想从B域名下的文件里面获取信息(这句话是我上网看到的) 2.一般请求(本地测试): 请求页 响应页      这样做是没问题的. 但我如果将Ajax请求的url ...

  4. Octopress创建GitHub Pages——基于代码托管的静态博客

    Github Pages是静态网页来的,官方也半认可了它的博客用途,代码挂在github上,随时都可以更改,算是不错的一种尝试,因为它是静态的,所以在表现上会自由得多,但是,同样因为它是静态的,管理上 ...

  5. gets和fgets函数的区别

    1. gets与fgets gets函数原型:char*gets(char*buffer);//读取字符到数组:gets(str);str为数组名. gets函数功能:从键盘上输入字符,直至接受到换行 ...

  6. 复习-C语言内嵌汇编-初级(1)

    打印hello world并改变变量i的值 # include <stdio.h> int main() { ; __asm__( "mov %0, #4\n" :&q ...

  7. 【Chromium中文文档】Web安全研究

    转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Extension_Sec ...

  8. 判断进程是64bit还是32bit

    #pragmaregion Includes#include<stdio.h>#include <windows.h>#pragmaendregionBOOL  DoesWin ...

  9. Qt编译时MinGW去掉对gcc动态库的依赖(去掉对libgcc_s_dw2-1.dll,libstdc++-6.dll的依赖)

    用Qt写点东西,我一般是下载官方的MinGW编译工具包,它有个不好的地方,经常还会多一些除了Qt库以外的其它的依赖动态链接库,比如:libgcc_s_dw2-1.dll,libstdc++-6.dll ...

  10. python 读取utf8文件

    有时候默认是gbk编码,但是要读取utf8文件,所以会出现decode 错误. 使用codecs模块: import codecs file = codecs.open('filename','r', ...