参考 《Java核心技术卷Ⅰ》
源码
public class ObjectAnalyzer {
private ArrayList<Object> visited = new ArrayList<>();
public String toString(Object obj) {
if (null == obj)
return "null";
if (visited.contains(obj))
return "...";
visited.add(obj);
Class<?> cl = obj.getClass();
if (cl == String.class)
return (String) obj;
if (cl.isArray()) {
StringBuilder r = new StringBuilder(cl.getComponentType() + "[]{");
for (int i = 0; i < Array.getLength(obj); i++) {
if (i > 0) {
r.append(",");
Object val = Array.get(obj, i);
if (cl.getComponentType().isPrimitive())
r.append(val);
else
r.append(toString(val));
}
}
return r + "}";
}
StringBuilder r = new StringBuilder(cl.getName());
do {
r.append("[");
Field[] fields = cl.getDeclaredFields();
AccessibleObject.setAccessible(fields, true);
for (Field f : fields) {
if (!Modifier.isStatic(f.getModifiers())) {
if (!r.toString().endsWith("["))
r.append(",");
r.append(f.getName()).append("=");
try {
Class<?> t = f.getType();
Object val = f.get(obj);
if (t.isPrimitive())
r.append(val);
else
r.append(toString(val));
} catch (Exception e) {
e.printStackTrace();
}
}
}
r.append("]");
cl = cl.getSuperclass();
if (cl == Object.class)
break;
} while (cl != null);
return r.toString();
}
}
测试代码
public class ObjectAnalyzerTest {
public static void main(String[] args) {
List<Integer> sequares = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
sequares.add(i * i);
}
System.out.println(new ObjectAnalyzer().toString(sequares));
}
}
运行结果
java.util.ArrayList[elementData=class java.lang.Object[]{,java.lang.Integer[value=4][],java.lang.Integer[value=9][],java.lang.Integer[value=16][],java.lang.Integer[value=25][],null,null,null,null,null},size=5][modCount=5][]