您的位置:首页 > 其它

程序清单-通用的toString方法

2017-12-24 22:34 183 查看
一种公认的可供任意类使用的toString方法:

(循环引用将会导致无限递归,因此使用visited记录已经被访问过的对象)

public class ObjectAnalyzer {
private ArrayList<Object> visited = new ArrayList<Object>();

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();
AccessibleObject.setAccessible(fields,true);
for (Field f:fields){
if(!Modifier.isStatic(f.getModifiers())){
if (!r.endsWith("[")) r+=",";
r+=f.getName()+"=";
try {
Class t = f.getType();
Object val = f.get(obj);
if (t.isPrimitive()) r+=val;
else r+=toString(val);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
r+="]";
cl = cl.getSuperclass();
}while (cl!=null);
return r;
}
}


public class ObjectAnalyzerTest {

public static void main(String[] args){
ArrayList<Integer> squares = new ArrayList<Integer>();
for (int i=1;i<5;i++){
squares.add(i*i);
}
System.out.println(new ObjectAnalyzer().toString(squares));
}
}


输出信息:

java.util.ArrayList[elementData=class java.lang.Object[]{java.lang.Integer[value=1][][],java.lang.Integer[value=4][][],java.lang.Integer[value=9][][],java.lang.Integer[value=16][][],null,null,null,null,null,null},size=4][modCount=4][][]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: