继续上一篇: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. 树 -- AVL树

    前言 通过之前对二叉查找树的讨论,我们知道在给定节点数目的情况下,二叉树的高度越低,查找所用时间也就越短. 在讨论红黑树的时候,我们说过红黑树并非完全"平衡"的二叉树,只是近似&q ...

  2. js数组与对象的一些区别。

    之前以为js对象即数组,今天用length取对象的长度老是undefined,用concat合并两个对象也不行,于是网上找了一下, 获取对象的长度 function length(o) { var c ...

  3. Eclipse 修改字体

  4. Cookies与保持登录(新浪微博的简单模拟登录)

    Cookies与保持登录(新浪微博的简单登录) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino ...

  5. PHP fopen和fwrite函数实现创建html页面

    思路 用fopen函数和fread函数得到模板,然后用str_replace函数替换模板标签为变量,最后用fwrite函数输出新的HTML页面 index.html模板页面 <!DOCTYPE ...

  6. [LeetCode]题解(python):154-Find Minimum in Rotated Sorted Array II

    题目来源: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/ 题意分析: 给定一个有重复的翻转的数组,找到最 ...

  7. 走进C标准库(7)——"string.h"中函数的实现memcmp,memcpy,memmove,memset

    我的memcmp: int memcmp(void *buf1, void *buf2, unsigned int count){ int reval; while(count && ...

  8. 配件BOM定义限制(只定义配件的)

    应用 Oracle Bill Of   Materiel 层 Level Function 函数名 Funcgtion Name BOM_BOMFDBOM 表单名 Form Name BOMFDBOM ...

  9. WIX 学习笔记 - 2 第一个WIX 项目 HelloWIX

    程序员们都非常熟悉 Hello World!,基本上所有的语言书都以打印一个 Hello World! 作为第一个代码示例. 我们也要发扬代码界的优良传统,使用 Hello WIX! 作为我们的入门示 ...

  10. outlook 2003配置连接exchange server 2010报错——无法完成此操作。 与 Microsoft Exchange Server 的连接不可用。 Outlook 必须联机或连接才可完成该操作

    最近安装了一台Exchange 2013邮件服务器,但在客户端Outlook 2013手动配置邮箱时却发现了如下错误:   这里说一个简单的解决办法,实际上第一次启动Outlook时可以自动发现,只需 ...