需求:在父類中重寫toString()方法,當(dāng)子類不重寫toString()方法時(shí)什猖,不會(huì)打印對(duì)象地址橡疼,而是打印子類參數(shù)的值。便于日志打印揭朝。
Apache 的 commons-lang3 的工具包里有一個(gè) ToStringBuilder 類队贱,可以實(shí)現(xiàn)上述需求:
但注意點(diǎn):
- 子類使用lombok的@Data注解時(shí),會(huì)覆蓋父類toString()方法潭袱,父類重寫的不會(huì)生效柱嫌;
- ToStringBuilder本質(zhì)是通過反射來實(shí)現(xiàn)的,性能比較低屯换,不如在子類上使用@Data注解编丘;
引入依賴:
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.4</version>
</dependency>
代碼實(shí)現(xiàn):
public abstract class BaseDto {
/**
* 重寫父類toString()方法,使得null值不進(jìn)行打印彤悔,便于日志輸出格式嘉抓。
*/
@Override
public String toString() {
/**
* 通過反射來獲取到 屬性名和屬性值 效率不高。
* 并且子類若使用lombok注解的@Data注解時(shí)晕窑,會(huì)覆蓋父類的toString方法抑片。
*
* ToStringStyle.DEFAULT_STYLE:對(duì)象及其屬性一行顯示(默認(rèn)值)
* ToStringStyle.MULTI_LINE_STYLE:屬性換行顯示
* ToStringStyle.NO_FIELD_NAMES_STYLE:不顯示屬性名,只顯示屬性值
* ToStringStyle.SHORT_PREFIX_STYLE:對(duì)象名稱簡寫
* ToStringStyle.SIMPLE_STYLE:只顯示屬性
*/
return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) {
@Override
public ToStringBuilder append(String fieldName, Object obj) {
//當(dāng)屬性為null時(shí)杨赤,不進(jìn)行打印輸出
if (obj != null) {
return super.append(fieldName, obj);
}
return this;
}
}.toString();
}
}
子類:
//@Data 注解將會(huì)覆蓋父類的toString()
@Data
public class User extends BaseDto {
private String name;
private int age;
}