java實體類列印所有屬性工具類(ReflectionToStringBuilder)
阿新 • • 發佈:2019-01-04
昨天看視訊無意間看到這個工具,終於不用重寫toString方法了。
相對於toString方法,程式碼簡潔 , 無須任何配置, Model 屬性變化 , 無需修改 toString
缺陷:安全性問題 , 反射私有屬性值也會暴露 .
為了防止暴露,我們可以重寫accept方法,剔除不想暴露的屬性。
改進:利用ToStringBuilder彌補(通過 ReflectionToStringBuilder 子類 , 覆蓋其 accept 方法來加以篩選 )
示例程式碼如下:
public String toString() {
return (new ReflectionToStringBuilder(this ) {
protected boolean accept(Field f) {
return super.accept(f) && !f.getName().equals(“password”);
}}).toString();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
程式碼解釋: toString 方法會跳過名為 password 屬性
ToStringStyle 抽象類與設計模式
ToStringBuilder 封裝 的三個屬性 :
/**
- Current toString buffer, not null.
*/
private final StringBuffer buffer;//封裝最終結果
/**
- The object being output, may be null.
*/
private final Object object;//toString 物件
/**
- The style of output to use, not null.
*/
private final ToStringStyle style;
關於型別ToStringStyle 在 ToStringBuilder 原始碼中的利用 ,
ToStringBuilder 類中所有的方法 append 都是通過呼叫屬性 style 相應方法實現 .
ToStringStyle 設計模式 : 單例模式的衍生,返回子類物件
本文小結 :
①ToStringBuilder分而治之, 通過屬性 ToStringBuilder 來分離功能的呼叫與實現 . ②子類達到多型的單例少見, 通過子類 StandardToStringStyle 提供了一個更為靈活的擴充套件 .
③具體實現大家可以參考 ReflectionToStringBuilder 原始碼 .