利用Java Reflect机制编写万能toString()方法

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; // 如果c1String类型,直接转换

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;

}

}

posted on 2013-02-19 21:00  蜜雪薇琪  阅读(335)  评论(0编辑  收藏  举报