《Java核心技术 卷I》 一 在运行时使用反射分析对象


/**
*代码来源:Java核心技术 卷I
*只为分享给他人,而将代码奉上
*/
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Array;
import java.util.ArrayList;

import java.lang.reflect.*;

public class ObjectAnalyzerTest {

	public static void main(String[] args) {

		ArrayList<Integer> squares = new ArrayList<>();
		for(int i = 1;i<=5;i++) {
			squares.add(i+i);
		}
		System.out.println(new ObjectAnalyzer().toString(squares));
	}

}

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()) {
			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(Exception e) {
						e.printStackTrace();
					}
				}
			}
			r+="]";
			cl=cl.getSuperclass();
		}while(cl!=null);
		return r;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41750725/article/details/81252337
今日推荐