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


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

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

    由于打印的时候包含包名,感觉太长了,
    使用ToStringStyle.SHORT_PREFIX_STYLE 截掉包名
     
    import java.lang.reflect.Field;
    import org.apache.commons.lang.builder.ReflectionToStringBuilder;
    import org.apache.commons.lang.builder.ToStringBuilder;
     
     
    @Override
    public String toString() {
    //以前的“+”写法
    /*return "HolidayConfig [end_date=" + end_date + ", holiday_date="
    + holiday_date + ", holiday_id=" + holiday_id
    + ", holiday_name=" + holiday_name + ", holiday_type="
    + holiday_type + ", state=" + state + "]";*/
     
    //现在平常实体调用的方法
    return ToStringBuilder.reflectionToString(this,ToStringStyle.SHORT_PREFIX_STYLE);
     
     
    //user实体不打印password机密信息使用方法
    return (new ReflectionToStringBuilder(this) {
      protected boolean accept(Field f) {
                  return super.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=Thu Jan 06 17:31:10 CST 2011,exp_time=Sun Jan 06 17:31:10 CST 4109,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的同名方法。

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

  • 相关阅读:
    fort循环
    while
    函数和数组
    case
    init进程
    权限安全:堡垒机部署实践
    tcp首部当中seq和ack的增长规律
    VRRP
    MSTP
    字符集专题
  • 原文地址:https://www.cnblogs.com/cuker919/p/4878589.html
Copyright © 2020-2023  润新知