今天系统要打印日志,发现所有实体的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的同名方法。
分享到:
相关推荐
收集整理了一些toString的实现方式,相信其中一定有你喜欢的,还等什么赶紧下载吧,评论后积分返回
Java组件开发(1)ToStringBuilder
ToStringBuilder类的一些心得,需要的朋友可以参考一下
该库的主要动机是用于无法使用数据类且需要通过以下方式实现toString() / equals() / hashCode()的情况: 手工制作自己的:( 使用IDE生成的方法:( 使用Apache Common的和 可定制的toString()格式(可以复制Kotlin的...
commons-lang3-3.7完整官方资料,对打印数据和字符拼接来说这个对内存做了很大优化 E.G: System.out.println(ToStringBuilder.reflectionToString(next, ToStringStyle.SHORT_PREFIX_STYLE));
commons-lang3.3.1.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。为JRE5.0+的更好的版本所提供 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE....
hashCodeBuilder EqualsBuilder ToStringBuilder
执行main函数即可,如果想要打印实体类的详细信息,在实体类中添加: @Override public String toString() { return ToStringBuilder.reflectionToString(this); } 其依赖的包为:"org.apache.commons:commons-lang...
commons-lang.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE.txtMETA-INF/NOTICE.txtorg.apache....
commons-lang3.3.1.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。为JRE5.0+的更好的版本所提供 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE....
实用程序测试版实用程序库的扩展,其中包括“测试版”中的库包括基于反射的 ToStringBuilder,以及其他一些随机的想法
使用C#实现的Jakarta Commons中最常用的模块的子集。 模块:TypeUtils(复制,验证),MapUtils(合并,创建),ToStringBuilder,EqualsToBuilder,TypeIntrospector,ListUtils