Java反射机制==>运行时使用反射分析对象

来源:互联网 发布:腾讯对战平台mac版 编辑:程序博客网 时间:2024/06/15 01:57

1、利用反射机制可以查看在编译时不清楚的对象域

package 反射机制;import java.util.ArrayList;public class ObjectAnalyzerTest {    public static void main(String[] args) {        ArrayList<Integer> s=new ArrayList<>();        for(int i=1;i<6;i++){            s.add(i*i);        }        System.out.println(new ObjectAnalyzer().toString(s));    }}
package 反射机制;import java.lang.reflect.AccessibleObject;import java.lang.reflect.Array;import java.lang.reflect.Field;import java.lang.reflect.Modifier;import java.util.ArrayList;/** * 在运行时使用反射分析对象 *  * @author asus1 * */public class ObjectAnalyzer {    private ArrayList<Object> visited = new ArrayList<>();    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()) {            // cl.getComponentType()返回数组的class对象            String r = cl.getComponentType() + "[]{";            for (int i = 0; i < Array.getLength(obj); i++) {                if (i > 0)                    r += ",";                Object val = Array.get(obj, i);                // isPrimitive()判断指定的class对象是否是一个基本类型                if (cl.getComponentType().isPrimitive())                    r += val;                else r+=toString(val);            }            return r + "}";        }        // 检查类及其父类的域        String r = cl.getName();        do {            r += "[";            Field[] fields = cl.getDeclaredFields();            // 为Field设置可访问标志,falg=true表示屏蔽Java语言的访问检查,使得对象的私有属性可以被查询和设置            AccessibleObject.setAccessible(fields, true);            // 获取field的值            for (Field f : fields) {                if (!Modifier.isStatic(f.getModifiers())) {                    if (!r.endsWith("["))                        r += ",";                    r += f.getName() + "=";                    try {                        Class t = f.getType();                        // f.get(obj),根据obj,获取域f的值                        Object val = f.get(obj);                        if (t.isPrimitive())                            r += val;                        else                            r += toString(val);                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }            r += "]";            cl = cl.getSuperclass();        } while (cl != null);        return r;    }}

输出结果:
java.util.ArrayList[elementData=class
java.lang.Object[]{java.lang.Integer[value=1][][],java.lang.Integer[value=4][][],
java.lang.Integer[value=16][][],
java.lang.Integer[value=25][][],
null,null,null,null,null},size=5][modCount=5][][]