Groovy中那些神奇注解之ToString
继续上一篇:Groovy中那些神奇注解之Memoized
这篇就讲讲@groovy.transform.ToString这个注解,这注解太熟悉了,熟悉到让人一看就知道是干吗的,不就是把Bean转在String么?
没错,它就是把Bean转成String,只不过比Java默认的类名加上HashCode可是好太多了,来个例子(Groovy自带了dump()和inspect()方法,也是查看对象的,写在一起做比较了)
@groovy.transform.ToString class Book{def namedef 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的值缓存起来 |
好了,就这么多了,休息,休息一下
转载于:https://www.cnblogs.com/varlxj/p/5181788.html
Groovy中那些神奇注解之ToString相关推荐
- Spring Security 中的权限注解很神奇吗?
最近有个小伙伴在微信群里问 Spring Security 权限注解的问题: 很多时候事情就是这么巧,松哥最近在做的 tienchin 也是基于注解来处理权限问题的,所以既然大家有这个问题,咱们就一块 ...
- 难以想象SpringBoot中的条件注解底层居然是这样实现的
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...
- 面试:SpringBoot中的条件注解底层是如何实现的?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...
- 面试:Spring Boot 中的条件注解底层是如何实现的?
SpringBoot内部提供了特有的注解:条件注解(Conditional Annotation).比如@ConditionalOnBean.@ConditionalOnClass.@Conditio ...
- Mybatis中的@SelectKey注解
一.创建Maven项目 在pom.xml中,添加mybatis依赖,mysql-jdbc依赖,把编译版本改为1.8 你问,为啥mybatis不会自动依赖mysql-jdbc,需要手动写明?答:因为my ...
- Groovy中的闭包
groovy中的一个核心语法:closurs,也叫闭包.闭包在groovy中是一个处于代码上下文中的开放的,匿名代码块.它可以访问到其外部的变量或方法. 1. 句法 1.1 定义一个闭包 { [clo ...
- Spring 中的各种注解,光会用可不够哦!
来源:https://digdeep.cnblogs.com/digdeep/p/4525567.html 1. Java中的注解 2. 使用 元注解 来自定义注解 和 处理自定义注解 3. spri ...
- 【Groovy】Groovy 动态语言特性 ( Groovy 中函数实参自动类型推断 | 函数动态参数注意事项 )
文章目录 前言 一.Groovy 中函数实参自动类型推断 二.函数动态参数注意事项 三.完整代码示例 前言 Groovy 是动态语言 , Java 是静态语言 ; 本篇博客讨论 Groovy 中 , ...
- java中spring的注解_spring中的各种注解解析
Spring中的注解大概可以分为两大类: 1)spring的bean容器相关的注解,或者说bean工厂相关的注解: 2)springmvc相关的注解. spring的bean容器相关的注解,先后有:@ ...
- TypeScript笔记(4)—— TypeScript中的类型注解
TypeScript(4):类型注解 [导读]JavaScript是若类型语言,而TypeScript里的类型注解是一种轻量级的为函数或变量添加约束的方式,为我们提供了静态类型分析能力,这样我们就可以 ...
最新文章
- asp.net 1.1/ 2.0 中快速实现单点登陆
- centos7每天定时删除备份mysql文件
- vue踩坑记-在项目中安装依赖模块npm install报错
- LD_LIBRARY_PATH should not contain the current directory
- 从ACL2021看对比学习在NLP中的应用
- pythonxml库_Python XML操作
- 使用python制作趣味小游戏—投骰子
- java 银行卡号_java银行卡号判断银行
- 五大理由!建议你选择中国电信 CTWing 物联网平台?
- 实验五 集线器和交换机的区别
- 注册Apple ID -- 常识
- 404网站服务器错误怎么解决,网站404错误怎么解决?[终极Xenu死链工具]
- Vue表单输入绑定(v-model)
- 【将门创投】这12张图生动地告诉你,深度学习中的卷积网络是怎么一回事?...
- Unity使用UnityWebRequest实现本地日志上传到web服务器
- 《淘宝店铺营销推广一册通》一2.2 选择店铺行业
- 追剧人的福利来了,这几款APP让你痛快追剧
- MySQL 删除数据库
- 如何获取(GET)一杯咖啡——星巴克REST案例分析
- play 框架目录结构