/**
*代码来源: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;
}
}
《Java核心技术 卷I》 一 在运行时使用反射分析对象
猜你喜欢
转载自blog.csdn.net/qq_41750725/article/details/81252337
今日推荐
周排行