这是今天看Java核心技术:基础知识 中反射方面的内容中看到的一个比较使用的工具方法。
通过调用该方法我们可以查看对象内部所有域的值。
public class ObjectAnalyzer {
private static ObjectAnalyzer objAnalyzer;private ArrayList<Object> visited = new ArrayList<Object>();
public static ObjectAnalyzer getObjAnalyzer() {
if(objAnalyzer == null) {
objAnalyzer = new ObjectAnalyzer();
}
return objAnalyzer;
}
public String toString(Object obj) {
if(obj == null) return "null";
if(visited.contains(obj)) return "....";
visited.add(obj);
Class cl = obj.getClass();
if(cl == String.class) return (String) obj;
if(cl.isArray()) {
String r = cl.getComponentType()+"[]{";
for(int i=0; i<Array.getLength(obj); i++) {
if(i > 0) r+=",";
Object val = Array.get(obj, i);
if(cl.getComponentType().isPrimitive()) r+= val;
else r+= toString(val);
}
return r + "}";
}
String r = cl.getName();
do {
r+="[";
Field[] fields = cl.getDeclaredFields();
/**
* Shield Java Access Control
*/
AccessibleObject.setAccessible(fields, true);
for(Field f : fields) {
/**
* Judge the field's modifier, whether it is a static
*/
if(!Modifier.isStatic(f.getModifiers())) {
if(!r.endsWith("[")) r+=",";
r+=f.getName()+"=";
try {
Class t = f.getType();
Object val = f.get(obj);
/**
* Judge if field is a primitive type
*/
if(t.isPrimitive()) r += val;
else r += toString(val);
} catch(Exception e) {
e.printStackTrace();
}
}
}
r+="]";
cl = cl.getSuperclass();
} while(cl != null);
return r;
}
}