读书人

利用Java Reflect机制编撰万能toStrin

发布时间: 2013-01-05 15:20:39 作者: rapoo

利用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;

?

??? }

}

读书人网 >操作系统

热点推荐