ToStringBuilder和ToStringStyle(覆盖每个实体的 toString 方法)

摘要:
因此,它的分析基于ToStringStyle的分析。StringBufferbuffer;SB用于连接一切。如果缓冲区为空,将生成大小为512的新StringBuffer。Byte、char、double、float、int、long、Object、short与上述4相同。reflectionToString系列使用静态方法提供对象字段的自动映射和输出。其原理是使用ReflectionToStringBuilder的对应toString方法。

今天系统要打印日志,发现所有实体的toString()方法 都用的是简单的"+",因为每"+" 一个就会 new 一个 String 对象,

这样如果系统内存小的话会暴内存(前提系统实体比较多)。

由于打印的时候包含包名,感觉太长了,
使用ToStringStyle.SHORT_PREFIX_STYLE 截掉包名
importjava.lang.reflect.Field;
importorg.apache.commons.lang.builder.ReflectionToStringBuilder;
importorg.apache.commons.lang.builder.ToStringBuilder;
@Override
publicStringtoString(){
//以前的“+”写法
/*return"HolidayConfig[end_date="+end_date+",holiday_date="
+holiday_date+",holiday_id="+holiday_id
+",holiday_name="+holiday_name+",holiday_type="
+holiday_type+",state="+state+"]";*/
//现在平常实体调用的方法
returnToStringBuilder.reflectionToString(this,ToStringStyle.SHORT_PREFIX_STYLE);
//user实体不打印password机密信息使用方法
return(newReflectionToStringBuilder(this){
protectedbooleanaccept(Fieldf){
returnsuper.accept(f)&&!f.getName().equals("password");
}
}).toString();
}
打印样列:
com.domain.entity.parameterconfig.HolidayConfig@60aeb0[holiday_id=11,holiday_name=6666,end_date=<null>,holiday_type=1,state=<null>]
截掉包名后只剩下类名:
TariffTimeSpan[tariffTimeSpanPK=TariffTimeSpanPK[time_span_id=123456,favor_type=1,time_begin=<null>],time_span_name=<null>,time_end=<null>,discount=115,eff_time=ThuJan0617:31:10CST2011,exp_time=SunJan0617:31:10CST4109,staff_id=<null>,create_time=<null>]





参考资料:
http://rmn190.javaeye.com/blog/349479

---------------------------------------------------------------------------------

ToStringBuilder用于生成对象的toString方法,在MiddleGen中比较常见。它的核心是使用ToStringStyle生成字符串。所以对其分析是建立在对ToStringStyle的分析之上的。
1.私有变量
ToStringStyle defaultStyle;缺省的Style,缺省赋值为ToStringStyle.DEFAULT_STYLE。
StringBuffer buffer;用于连接所有内容的SB。
Object object;需要输出的对象。
ToStringStyle style;所使用的Style。
2.构造函数
ToStringBuilder的构造函数必须最少包含需要输出的对象,另外也可以在构函中指定buffer和style。下面只描述全参数的处理过程:
如果style为空,则使用缺省的style。
如果buffer为空,则新生成一个大小为512的StringBuffer。
利用参数对object变量赋值。
利用style的appendStart输出开始标记。
3.append方法
append方法可以把参数中的原始类型或对象类型连接到该对象的buffer中。append方法利用了Decorator模式,所以最后都返回本对象。
3.1 单个原始类型变量和Object变量的append方法
这种方法的参数为一个原始类型变量或Object变量,但参数中可能含有FieldName,也可以没有。
boolean利用style的对应append方法进行输出,其中如果没提供FieldName,置null。
byte,char,double,float,int,long,Object同上
3.2 数组类型的append方法
这种方法的参数为一个包含原始类型变量或Object变量的数组,但参数中可能含有FieldName,也可以没有。如果含有FieldName,参数中可能含有是否输出细节的布尔变量fullDetail,也可能没有。
boolean利用style的对应append方法进行输出,其中如果没提供FieldName,置null。如果提供了FieldName,而没有提 供fullDetail,则fullDetail置null。否则利用BooleanUtils的toBooleanObject把boolean变量转 换为Boolean.TRUE或Boolean.FALSE。
byte,char,double,float,int,long,Object,short同上
4.reflectionToString族
这组方法使用静态方式,提供对对象字段的自动映射和输出的功能,其原理采用ReflectionToStringBuilder的对应toString方法处理。
5.toString方法
toString方法输出最后的字符串。执行以下操作:
如果object为空,则利用style的getNullText方法输出空标记。
否则利用style的appendEnd输出结束标记。
返回buffer的toString方法。
6.其它
6.1 appendAsObjectToString方法
同ToStringStyle的appendCyclicObject方法。
6.2 appendSuper方法
同ToStringStyle的同名方法。
6.3 appendToString方法
同ToStringStyle的同名方法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

免责声明:文章转载自《ToStringBuilder和ToStringStyle(覆盖每个实体的 toString 方法)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# GridView 操作汇总聪明的老板,都懂得让人占便宜(经典)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java术语(PO/POJO/VO/BO/DAO/DTO)

PO(persistant object) 持久对象 在o/r 映射的时候出现的概念,如果没有o/r映射,就没有这个概念存在了.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对数据库的操作.VO(value...

win7下JAVA环境变量配置方法

1、首先,根据自己的需要下载1.6或者1.7的JDK,安装JDK。(安装的时候记一下安装目录,后面会用到) 2、右键计算机→属性→高级系统设置→高级→环境变量,在系统变量部分新建名为"JAVA_HOME"的变量,变量值为之前安装jdk的目录,例如本人的为"D:Javajdk1.6.0_10"。 3、在系统变量部分新建名为"classpath"的变量,变量...

11-C#反射机制

C#反射机制 转自:http://blog.csdn.net/educast/article/details/2894892 反射的用途:    (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。     (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所...

Chrome 开发者工具的使用介绍

谷歌浏览器开发者工具打开方式 1. 在网页中通鼠标右键 -> 检查 -> 打开控制台 2. 通过快捷键打开 F12 打开控制台,或者ctrl + shift + i 打开控制台 3. 通过自定义及控制 -> 更多工具 -> 开发者工具 选择元素  当在页面中有很多元素时需要找到某个元素时使用。首先点击开发者工具左上角的箭头,在用...

Java10 新特性

一、JDK10 发布   2018年3月21日, Oracle官方宣布Java10正式发布。   需要注意的是 Java 9 和 Java 10 都不是 LTS (Long-Term-Support) 版本。和过去的 Java 大版本升级不同,这两个只有半年左右的开发和维护期。而未来的 Java 11,也就是 18.9 LTS,才是 Java 8 之后第一个...

wincc flexable变量组态

1.变量分类 2.变量组态练习 3.变量组态之前新建一个设备连接取名connect 3.tag1组态bool类型,双击变量弹出下面窗口,具体如下图所示connect表示外部变量 4.组态tag2 5.组态tag3,与前两个不同 6.变量的其他属性 1)限制值 2)初始值 3)可以添加事件和注释...