public class ObjectAnalyzer {
private List<Object> container = new ArrayList<>();
private String toStringCore(Object obj){
// 如果对象为空,直接返回null
if(obj == null) return "null";
// 如果该对象的地址已经打印过了,就打印...
if(container.contains(obj)) return "...";
// 新对象,加入存在列表中
container.add(obj);
// 获取该对象的class对象
Class clazz = obj.getClass();
// 如果该类型是一个String,直接返回即可
if(clazz == String.class) return (String) obj;
// 如果对象是一个数组,注意不是集合对象
if(clazz.isArray()){
// 拿到数组的长度
int length = Array.getLength(obj);
// 拿到数组的元素类型
Class componentType = clazz.getComponentType();
String s = componentType.getName() + "[]{";
// String s = componentType.toString() + "[]{";
for (int i = 0; i < length; i++) {
Object component = Array.get(obj, i);
if(i > 0) s += ", ";
if(componentType.isPrimitive()) s += component;
else s += toStringCore(component);
}
return s + "}";
}
String r = clazz.getName();
r += "[";
do{
// 拿到所有的域
Field[] fields = clazz.getDeclaredFields();
// 一定记得设置私有域可访问
AccessibleObject.setAccessible(fields,true);
// 遍历所有的域
for (Field field : fields) {
// 如果这个域是个static域,它不隶属于对象,不打印
if(!Modifier.isStatic(field.getModifiers())){
if(!r.endsWith("[")) r += ", ";
// 拿到域的名字
String name = field.getName();
r += name + "=";
try {
// 拿到该域的值
Object val = field.get(obj);
// 拿到该域的装的东西的class对象
Class type = field.getType();
// 判断是不是基本类型
if(type.isPrimitive()) r += val;
else r += toStringCore(val);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
clazz = clazz.getSuperclass();
}while (clazz != null);
r += "]";
return r;
}
public String toString(Object object){
String s = toStringCore(object);
container.clear();
return s;
}
}
public static Object goodCopyOf(Object obj, int newLength){
Class c = obj.getClass();
// 如果不是数组,就滚蛋
if(!c.isArray()) return null;
// 拿长度
int length = Array.getLength(obj);
// 先new一个新的数组出来,这里一定不能直接new,要根据原数组的元素类型来new
Class componentType = c.getComponentType();
Object newArray = Array.newInstance(componentType,newLength);
/*
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
方法解释:
Object src : 原数组
int srcPos : 原数据要拷贝的第1个位置
Object dest : 目标数组
int destPos : 目标数组的粘贴的第1个位置
int length : 从原数组要copy的数组的长度
*/
System.arrraycopy(obj,0,newArray,0,Math.min(length,newLength));
return newArrray;
}
原文:https://www.cnblogs.com/doubest/p/12862495.html