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 ...
随机推荐
- ucenter 同步登录总结
部署: discuz默认安装后就安装了uc_server应用 各应用根目录必须有uc_client文件夹. 下载ucenter程序查看范例程序 应用管理中,应用的主 URL必须指向到应用的根目录,应用 ...
- 学习dijk最短路径中
#include<iostream> #include<math.h> #include<stdio.h> #include<algorithm> #i ...
- Ksoap 使用简介
转:http://www.open-open.com/bbs/view/1320111271749?sort=newest WebService 是一种基于SOAP协议的远程调用标准.通过WebSer ...
- scrapy中运行爬虫时出现twisted critical unhandled error错误
1. 试试这条命令: twisted critical unhandled error on scrapy tutorial python python27\scripts\pywin32_posti ...
- JQ中$(document.ready())
js中window.onload与jquery中$(document.ready())的区别 <html> <head> <script type='text/javas ...
- Delphi中TWebBrowser中注入Js
最近帮朋友做一个软件,其中要自动化某网页中的操作,最简的操作是调用自己写的代码. 代码如下: procedure TForm1.Button2Click(Sender: TObject);var i ...
- 使用C#开发Metro 风格应用的路线图 -- 触屏操作
原文 http://www.cnblogs.com/icuit/archive/2012/05/01/2478312.html win8支持多点触摸技术,而我们在屏幕上所做的各种操作,也最终转换为输入 ...
- java如何在函数中调用主函数的数组
import javax.swing.JOptionPane; public class Test { /** * @zdz */ public static void main(String[] a ...
- 一些复数运算的C语言实现
很久不写博客了.第一次写博客是在04年,最近的一次还是在大学时,在学校时,甚至还有过自己去买虚拟主机搭WordPress写博客的经历.现在工作时间越长,越发现积累的重要性.那么就从这里开始吧,重新开始 ...
- var 与function的权重浅析
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...