package com.accp.test.filed;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
public class ObjectAnalyzer {
private List<Object> visited = new ArrayList<Object>();
public String toString(Object obj) {
if (obj == null)
return null; // 如果obj为空..返回null
if (visited.contains(obj))
return "..."; // 如果visited中已经包含obj,返回...
visited.add(obj);
Class c1 = obj.getClass(); // 得到运行时对象
if (c1 == String.class)
return (String) obj; // 如果c1是String类型,直接转换
if (c1.isArray()) { // 如果是数组类型
String r = c1.getComponentType() + "[]{"; // 得到该数组组件类型的Class
for (int i = 0; i < Array.getLength(obj); i++) {
if (i > 0)
r += ",";
Object var = Array.get(obj, i); // 取得obj[i]元素的值
if (c1.getComponentType().isPrimitive()) // 如果为基本类型
r += var;
else
r += toString(var); // 递归调用
}
return r + "}";
}
String r = c1.getName(); // 得到obj名称
// 检查本类域和所有超类域
do {
r += "[";
Field[] fields = c1.getDeclaredFields(); // 得到本类和超类所有域
AccessibleObject.setAccessible(fields, true); // 将所有域设置为可访问的.
for (Field field : fields) {
if (!Modifier.isStatic(field.getModifiers())) {
if (!r.endsWith("["))
r += ",";
r += field.getName() + "=";
try {
Class type = field.getType(); // 得到字段类型
Object var = field.get(obj); //设置值
if (type.isPrimitive()) //判断是否为基本类型
r += var;
else
r += toString(var);
} catch (Exception e) {
e.printStackTrace();
}
}
}
r+="]";
c1 = c1.getSuperclass();
} while (c1 != null);
return r;
}
}