import java.util.*;
import java.lang.reflect.*;public class ObjectAnalyzerTest {
public static void main(String[] args) {
ArrayList<Integer> squares = new ArrayList<Integer>();
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<Object>();

public String toString(Object obj) {
if(obj == null) return "null";
if(visited.contains(obj)) return"...";
visited.add(obj); Class c = obj.getClass();

if(c == String.class) return (String)obj; if(c.isArray()) {
String r = c.getComponentType() + "[]{";

for(int i=0;i<Array.getLength(obj);i++) {
if(i>0)r+=",";
Object val = Array.get(obj,i);
if(c.getComponentType().isPrimitive()) r += val;
else r += toString(val);
} return r +="}";
} String r = c.getName(); do
{
r += "[";
Field[] fields = c.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 += "]";
c = c.getSuperclass();
}
while (c != null);
return r;
}
}