複雑なオブジェクトの出力--カスタムtoString

6231 ワード

まずクラスを見てみましょう
public class ComplexObject implements Serializable {

    private static final long         serialVersionUID = -3986831089858789914L;

    private int                    id;

    private String                    name;

    private AccountTypeEnum           type;

    private String                    national;

    private Date                      gmtCreate;

    private Date                      gmtModified;

    private String                    memo;

    private SubType1                 subType1;

    private List<SubType2>            subType2List;

    private final Map<String, String> infoMap          = new HashMap<String, String>();

}

複雑なオブジェクトComplexObjectには、次の属性があります.
1基本タイプ:String、列挙、int
2 Dateオブジェクト
3.カスタムオブジェクト
4.Listコレクション
5.Mapオブジェクト
 
出力されたオブジェクトが各フィールドの値を見極めやすい場合は?
1.ToStringBuilderのデフォルトスタイル
呼び出し方法:ToStringBuilder.reflectionToString(object)
 
2.ToStringBuilderのデフォルトMULTI_LINE_STYLE
呼び出し方法:ToStringBuilder.reflectionToString(customer,ToStringStyle.MULTI_LINE_STYLE)
 
3.カスタムtoStringメソッド
 private void getFields(Object obj, StringBuffer str, int level, boolean isListElement)
                                                                                                  throws IllegalArgumentException,
                                                                                                  IllegalAccessException {
        if (obj == null) {
            return;
        }

        Class clazz = obj.getClass();
        if (clazz == ComplexObject.class) {
            str.append(" " + clazz.getSimpleName() + "
"); level++; } // List if (isListElement) { for (int i = 0; i < level; i++) { str.append(" "); } str.append("└—— " + clazz.getSimpleName() + "
"); level++; isListElement = false; } // Field[] fieldArray = clazz.getDeclaredFields(); for (Field field : fieldArray) { for (int i = 0; i < level; i++) { str.append(" "); } field.setAccessible(true); // if (field.get(obj) == null) { str.append("└—— " + field.getName() + " = " + field.get(obj) + "
"); } else if (field.getType() == SubType1.class || field.getType() == SubType2.class ) { str.append("└—— " + field.getName() + "
"); getFields(field.get(obj), str, level + 1, false); } else if (field.getType() == List.class) { str.append("└—— " + field.getName() + "
"); List list = (List) field.get(obj); for (Object object : list) { getFields(object, str, level + 1, true); } } else if (field.getType() == Map.class) { str.append("└—— " + field.getName() + "
"); level++; Map map = (Map) field.get(obj); Set keySet = map.keySet(); for (Object key : keySet) { for (int i = 0; i < level; i++) { str.append(" "); } str.append("└—— " + key + " = " + map.get(key) + "
"); } } else if (field.getType() == Date.class) { str.append("└—— " + field.getName() + " = " + new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .format((Date) field.get(obj)) + "
"); } else { str.append("└—— " + field.getName() + " = " + field.get(obj) + "
"); } } }

呼び出し方法:
public String toString() {
        StringBuffer str = new StringBuffer("
----------------------
"); try { this.getFields(this, str, 0, false); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } str.append("----------------------
"); return str.toString(); }

出力構造:
 
----------------------
 ComplexObject
     └—— serialVersionUID = -3986831089858789914
     └—— id= 123
     └—— name = ss
     └—— type = PRIVATE_ACCOUNT
     └—— national = null
     └—— createStatus = OPEN
     └—— enableStatus = CAN_USE
     └—— gmtCreate = 2008-09-18 17:42:27
     └—— gmtModified = null
     └—— memo = null
     └—— subType1List
          └—— SubType1
               └—— SubType1 1= 2088102000419591
               └—— SubType1 2 = 2
               └—— SubType1 3 = 3
               └—— SubType1 4 = 4
               └—— SubType1 5 = 5        
     └—— SubType2
          └—— SubType2 1= 1
          └—— SubType2 2= 2
          └—— SubType2 3= 3
          └—— SubType2 4= 4
     └—— infoMap
           └—— key1= value1
           └—— key2= value2
           └—— key3= value3
           └—— key4= value4

反射を使用して、任意のオブジェクトタイプのネストをサポート