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的值缓存起来 |
好了,就这么多了,休息,休息一下

Groovy中那些神奇注解之ToString的更多相关文章
- Groovy中那些神奇注解之InheritConstructors
上一篇:Groovy中那些神奇注解之ToString 写完ToString,本来想今天就写到这了,突然觉得InheritConstructors注解实在也是个神器,写起来也没多少字,还是写了吧. In ...
- Groovy中那些神奇注解之Memoized
临近年关手头比较闲,去看了一下Groovy的官方文档,才发现原来Groovy中带了那么多的注解,很多注解带来的效果,有时候让人感觉“这不是在变魔法吧”. 个人很喜欢Groovy,写不成Ruby,Gro ...
- Mybatis中的@SelectKey注解
一.创建Maven项目 在pom.xml中,添加mybatis依赖,mysql-jdbc依赖,把编译版本改为1.8 你问,为啥mybatis不会自动依赖mysql-jdbc,需要手动写明?答:因为my ...
- 深入理解spring中的各种注解
Spring中的注解大概可以分为两大类: 1)spring的bean容器相关的注解,或者说bean工厂相关的注解: 2)springmvc相关的注解. spring的bean容器相关的注解,先后有:@ ...
- 深入理解spring中的各种注解(转)
Spring中的注解大概可以分为两大类: 1)spring的bean容器相关的注解,或者说bean工厂相关的注解: 2)springmvc相关的注解. spring的bean容器相关的注解,先后有:@ ...
- 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- Groovy中的闭包
Closures(闭包) 本节主要讲groovy中的一个核心语法:closurs,也叫闭包.闭包在groovy中是一个处于代码上下文中的开放的,匿名代码块.它可以访问到其外部的变量或方法. 1. 句法 ...
- 第5章—构建Spring Web应用程序—关于spring中的validate注解后台校验的解析
关于spring中的validate注解后台校验的解析 在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判 ...
- Groovy中的面向对象
Groovy中的面向对象 前面说到groovy支持脚本和类,前面一节已将简单说了脚本和类之间的关系,这一节主要介绍一下groovy中类的相关知识,即面向对象相关知识. 1.类型 1.1 原始类型 gr ...
随机推荐
- iOS协议
ios中的协议:大家猛一看 感觉挺高深的 其实ios中的协议就是c#,java中的接口 只是变了一个形式: 自我感觉ios中的协议没有c#中的接口好 人家的接口就是固定你的程序内容的 而ios中 ...
- Idea facet
idea错误:this inspection controls whether the persistence ql queries are error-checked 在project struct ...
- Python核心编程读笔 7: 条件和循环
第八章 条件和循环 一.if python中的条件表达式:很奇葩!!! smaller = (x < y and [x] or [y])[0] 或者: smaller = x if x < ...
- C++ Builder平台使用Indy9开发自动FTP程序01
Indy9与CB自带的Indy8不同处还是挺多的.首先就是图标变漂亮了,其次很多Method都重写了.它主要是依据Delph里的函数,力求与之相通.不同点在本系列的后续章节中会一一介绍. 在写ftp代 ...
- jQuery滚动广告 解决子div绝对定位与父div重叠引起的闪烁问题
这两天做了一个滚动广告栏的demo 功能有自动轮播 左右箭头移动 导航点选中图片移动效果 模仿的是新浪体育的广告 最难的问题就是子div绝对定位于父div 鼠标移入子div 系统会判定鼠标移出了父di ...
- attempting to bokeyaunrun eclipse useing the jre instead of jdk,to run eclipse using
关于eclipse运行出现,attempting to bokeyaunrun eclipse useing the jre instead of jdk,to run eclipse using错误 ...
- EditText 默认不获取焦点,弹出软键盘布局变形解决方案
关于弹出软键盘布局变形解决方案: 在androidMainfest.xml文件中在此Activity中写入 android:windowSoftInputMode="adjustPan&qu ...
- Linux 如何打开端口
举例: 开放10000端口的解决步骤如下: 1.修改/etc/sysconfig/iptables文件,增加如下一行: -A RH-Firewall-1-INPUT -m state --state ...
- 《转》精巧好用的DelayQueue
该文章转自:http://www.cnblogs.com/jobs/archive/2007/04/27/730255.html 我们谈一下实际的场景吧.我们在开发中,有如下场景 a) 关闭空闲连接. ...
- mac下通过xcodebuild使用oclint
step1 :下载oclint并安装 下载地址: http://oclint.org/downloads.html 选择mac os x或者darwin的包,下载到本地. 文件夹类似以下: oclin ...