ToStringBuilder 用于构建一个类的toString字符串的工具类,使用该类需要导入commons-lang.jar;或者导入maven仓库:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.8.1</version> </dependency>然后导入即可:import org.apache.commons.lang3.builder.ToStringBuilder;
因为大部分实体的toString()方法都用的是简单的"+",而每"+"一个就会new一个String对象,这样如果系统内存小的话会暴内存。使用ToStringBuilder就可以避免暴内存这种问题的。
append()方法: 该方法用于自定义添加需要打印哪些变量,只有使用append添加的变量才会在toString函数中打印。
// 方法源码 public ToStringBuilder append(Object obj) { this.style.append(this.buffer, (String)null, obj, (Boolean)null); return this; } public ToStringBuilder append(String fieldName, Object obj) { this.style.append(this.buffer, fieldName, obj, (Boolean)null); return this; } ...reflectionToString()方法(静态): 该方法使用反射机制打印一个类中的所有变量,该函数还提供一个变量style,建议使用ToStringStyle.DEFAULT_STYLE。
//方法源码 public static String reflectionToString(Object object) { return ReflectionToStringBuilder.toString(object); } public static String reflectionToString(Object object, ToStringStyle style) { return ReflectionToStringBuilder.toString(object, style); } ...通过ToStringBuilder->实现toString方法: 1.ToStringBuilder比较适合在打日志时,能够很方便的自动打印对象中的属性值; 2.利用反射原理拿到对象中域fields的属性并添加到新的对象中builder并最终toString; (注:idea安装了lombok插件,只要在类前增加@Getter和@Setter注解即可不用手写方法!)
import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.builder.ToStringBuilder; import java.io.Serializable; import java.lang.reflect.Field; import java.sql.Timestamp; /** * DTO: 基础数据传输对象(Data Transfer Object) */ @Getter @Setter public class BaseDTO implements Serializable { private String createBy; private String updatedBy; private Timestamp createTime; private Timestamp updateTime; @Override public String toString() { ToStringBuilder builder = new ToStringBuilder(this); Field[] fields = this.getClass().getDeclaredFields(); try { for (Field f : fields) { f.setAccessible(true); builder.append(f.getName(), f.get(this)); //builder.append(f.getName(), f.get(this)).append("\n"); } } catch (Exception e) { builder.append("toString builder encounter an error"); } return builder.toString(); } }也可以这样使用:
@Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE); }两种方法结果差不多,只是append方法更灵活,还可以在每次属性添加后换行或者自定义字符串;而reflectionToString静态方法简单直白。