利用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;?//?如果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;
?
??? }
}