1. 程式人生 > >java實體類列印所有屬性工具類(ReflectionToStringBuilder)

java實體類列印所有屬性工具類(ReflectionToStringBuilder)

昨天看視訊無意間看到這個工具,終於不用重寫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 原始碼 .