java类转字符串写法ToStringBuilder的应用
java开发中你可能需展示类的属性值,把对象记录为日志,调试输出等操作。ToStringBuilder提供简便类转字符串写法。
演示User类
User.java
package com.weizhixi.util;
public class User {
    private Long id;
    private String username;
    private String password;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}没用ToStringBuilder前
你可能还在:
User user = new User(); System.out.println(user); //com.weizhixi.util.User@16d2633
真伤心,看不到对象里面有什么值。之后你会:
System.out.println("id:"+user.getId()+",username:"+user.getUsername()+",password:"+user.getPassword());
//id:1,username:weizhixi,password:123456这写法真逆天,对象字段多就晕倒。
使用ToStringBuilder后
真心方便,只需在User对象中重写toString
@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this);
}这下好了:
System.out.println(user); //com.weizhixi.util.User@160877b[id=1,username=weizhixi,password=123456]
ToStringBuilder的风格
public abstract class ToStringStyle implements Serializable {
    private static final long serialVersionUID = -2587890625525655916L;
    public static final ToStringStyle DEFAULT_STYLE = new ToStringStyle.DefaultToStringStyle();
    public static final ToStringStyle MULTI_LINE_STYLE = new ToStringStyle.MultiLineToStringStyle();
    public static final ToStringStyle NO_FIELD_NAMES_STYLE = new ToStringStyle.NoFieldNameToStringStyle();
    public static final ToStringStyle SHORT_PREFIX_STYLE = new ToStringStyle.ShortPrefixToStringStyle();
    public static final ToStringStyle SIMPLE_STYLE = new ToStringStyle.SimpleToStringStyle();
    ...
}使用方法:
@Override
public String toString() {
    //return ToStringBuilder.reflectionToString(this);
    //return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE);
    //return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
    //return ToStringBuilder.reflectionToString(this, ToStringStyle.NO_FIELD_NAMES_STYLE);
    //return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    return ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE);
}使用:DEFAULT_STYLE 默认风格
com.weizhixi.util.User@160877b[id=1,username=weizhixi,password=123456]
使用:MULTI_LINE_STYLE 多行风格
com.weizhixi.util.User@160877b[ id=1 username=weizhixi password=123456 ]
使用:NO_FIELD_NAMES_STYLE 不含字段名风格
com.weizhixi.util.User@160877b[1,weizhixi,123456]
使用:SHORT_PREFIX_STYLE 短类名前缀风格
User[id=1,username=weizhixi,password=123456]
使用:SIMPLE_STYLE 简单风格
1,weizhixi,123456
完整示例
package com.weizhixi.util;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
public class User {
    private Long id;
    private String username;
    private String password;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE);
    }
}需要导入:
commons-lang3.jar
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.2.1</version> </dependency>
反射原理
看源码片段,ReflectionToStringBuilder类
...
protected void appendFieldsIn(Class<?> clazz) {
    if(clazz.isArray()) {
        this.reflectionAppendArray(this.getObject());
    } else {
        Field[] fields = clazz.getDeclaredFields();
        AccessibleObject.setAccessible(fields, true);
        Field[] arr$ = fields;
        int len$ = fields.length;
        for(int i$ = 0; i$ < len$; ++i$) {
            Field field = arr$[i$];
            String fieldName = field.getName();
            if(this.accept(field)) {
                try {
                    Object ex = this.getValue(field);
                    this.append(fieldName, ex);
                } catch (IllegalAccessException var9) {
                    throw new InternalError("Unexpected IllegalAccessException: " + var9.getMessage());
                }
            }
        }
    }
}
...
public String toString() {
    if(this.getObject() == null) {
        return this.getStyle().getNullText();
    } else {
        Class clazz = this.getObject().getClass();
        this.appendFieldsIn(clazz);
        while(clazz.getSuperclass() != null && clazz != this.getUpToClass()) {
            clazz = clazz.getSuperclass();
            this.appendFieldsIn(clazz);
        }
        return super.toString();
    }
}
...原创文章,转载请注明出处:https://www.weizhixi.com/article/55.html
