複雑なオブジェクトの出力--カスタムtoString
6231 ワード
まずクラスを見てみましょう
複雑なオブジェクト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メソッド
呼び出し方法:
出力構造:
反射を使用して、任意のオブジェクトタイプのネストをサポート
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
反射を使用して、任意のオブジェクトタイプのネストをサポート