public String toString(Object obj)
{
if(obj == null) 
return "null";

if(visted.contains(obj))
return "...";

visted.add(obj);
Class c = obj.getClass();
if(c == String.class)
return (String)obj;

if(c.isArray())
{
String arr = c.getComponentType() + "[]{";
for (int i = 0; i < Array.getLength(obj); i++)
{
if(i > 0)
arr += ",";
Object val = Array.get(obj , i);
if(c.getComponentType().isPrimitive())
arr += val;
else 
arr += toString(val);
}
return arr + "}";

}
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 += ",";
try
{
Class<?> c1 = f.getType();
Object val = f.get(obj);

if(c1.isPrimitive())
r += val;
//这是怎么执行的 debug看 继续for循环 为什么没重新进toString方法
else
r += toString(val);
}
catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}
r += "]";
c = c.getSuperclass();
}
while (c != null);
return r;
}

private ArrayList<Object> visted = new ArrayList<Object>();

解决方案 »

  1.   

    52行 进debug看是继续执行for循环 为什么没重进方法?
      

  2.   

    楼主 但看那个for循环的话 楼主你认为什么情况下会再进toString(Obj)方法 
    只有在else的情况下才会进toString(Obj)方法
    可能这样写就好了 
    for (int i = 0; i < Array.getLength(obj); i++)
    {
    if(i > 0)
    arr += ",";
    Object val = Array.get(obj , i);
    if(c.getComponentType().isPrimitive()){
    arr += val;
    }else{ 
    arr += toString(val);
    }
    }
      

  3.   

    debug 开始就进else toString方法 但却一直循环
      

  4.   

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

  5.   

    import java.lang.reflect.AccessibleObject;
    import java.lang.reflect.Array;
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    import java.util.ArrayList;
    public class Test{
    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 Test().toString(squares));
    }

    public String toString(Object obj)
    {
    if(obj == null) 
    return "null";
    if(visted.contains(obj))
    return "...";
    visted.add(obj);
    Class c = obj.getClass();
    if(c == String.class)
    return (String)obj;
    if(c.isArray())
    {
    String arr = c.getComponentType() + "[]{";
    for (int i = 0; i < Array.getLength(obj); i++)
    {
    if(i > 0)
    arr += ",";
    Object val = Array.get(obj , i);
    if(c.getComponentType().isPrimitive()){
    arr += val;
    }else{ 
    arr += toString(val);
    }
    }
    return arr + "}";
    }
    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 += ",";
    try
    {
    Class<?> c1 = f.getType();
    Object val = f.get(obj);

    if(c1.isPrimitive())
    r += val;
    //这是怎么执行的 debug看 继续for循环 为什么没重新进toString方法
    else
    r += toString(val);
    }
    catch (IllegalArgumentException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    catch (IllegalAccessException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    r += "]";
    c = c.getSuperclass();
    }
    while (c != null);
    return r;
    }

    private ArrayList<Object> visted = new ArrayList<Object>();
    }
    我这样是可以进else 然后进我在toString(Obj)的断点的 可以debug 楼主看有什么区别 吗
      

  6.   

    我写的可能不太清楚 . 我要问的是 为什么没有重新进入toString方法 , 而却继续循环了 我理解应该是死循环
      

  7.   

    知道怎么回事了 . arr += toString(val)的arr++使debug调式直接返回String , 中间加个临时变量debug就能看到完整的执行程序.