关于 toString 方法的重写工具 ToStringBuilder

Apache 的 commons-lang3 的工具包里有一个 ToStringBuilder 类,这样在打日志的时候可以方便的打印出类实例中的各属性的值。

依赖引入

<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.4</version>
</dependency>

重写 toString

@Override
public String toString() {
	return ToStringBuilder.reflectionToString(this);
}

打印结果参考:

com.zzz.other.City@4eec7777 [id=1,name = 杭州,province = 浙江,country=CN]

ToStringStyle

ToStringBuilder.reflectionToString 默认为 ToStringStyle.DEFAULT_STYLE

使用方法:

ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE);

ToStringStyle 还有其他样式,可调整 ToStringBuilder 的打印结果:

  • ToStringStyle.DEFAULT_STYLE:对象及其属性一行显示

    com.zzz.other.City@4eec7777[id=1,name=杭州,province=浙江,country=CN]
  • ToStringStyle.MULTI_LINE_STYLE:属性换行显示

    com.zzz.other.City@4eec7777[
      id=1
      name=杭州
      province=浙江
      country=CN
    ]
  • ToStringStyle.NO_FIELD_NAMES_STYLE:不显示属性名,只显示属性值

    com.zzz.other.City@4eec7777[1,杭州,浙江,CN]
  • ToStringStyle.SHORT_PREFIX_STYLE:对象名称简写

    City[id=1,name=杭州,province=浙江,country=CN]
  • ToStringStyle.SIMPLE_STYLE:只显示属性

    1,杭州,浙江,CN

原理解析

ReflectionToStringBuilder 主要是通过 java 反射实现的属性拼接。

org.apache.commons.lang.builder.ReflectionToStringBuilder

public static String toString(Object object, ToStringStyle style, 
                              boolean outputTransients, boolean outputStatics,
                              Class reflectUpToClass) {
	return new ReflectionToStringBuilder(object, style, null, 
                                         reflectUpToClass, outputTransients,
                                         outputStatics).toString();
}

public String toString() {
	if (this.getObject() == null) {
		return this.getStyle().getNullText();
	}
	Class clazz = this.getObject().getClass();
	this.appendFieldsIn(clazz);
	while (clazz.getSuperclass() != null && clazz != this.getUpToClass()) {
		clazz = clazz.getSuperclass();
		this.appendFieldsIn(clazz);
	}
	return super.toString();
}

其中参数 ToStringStyle 是个抽象类,定义了输出的格式 主要是 append 了一类类信息到字符串上,可以自己继承 ToStringStyle 实现自定义的输出格式。