反射代码 toString怎么执行的?

yulu27 2013-03-14 11:17:22
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>();
...全文
310 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yulu27 2013-03-16
  • 打赏
  • 举报
回复
知道怎么回事了 . arr += toString(val)的arr++使debug调式直接返回String , 中间加个临时变量debug就能看到完整的执行程序.
  • 打赏
  • 举报
回复
这代码真够乱的
yulu27 2013-03-14
  • 打赏
  • 举报
回复
引用 4 楼 yulu27 的回复:
这是main方法 Java code?123456ArrayList<Integer> squares = new ArrayList<Integer>(); for (int i = 1; i <= 5; i++) { squares.add(i * i); } System.out.pri……
我写的可能不太清楚 . 我要问的是 为什么没有重新进入toString方法 , 而却继续循环了 我理解应该是死循环
a597926661 2013-03-14
  • 打赏
  • 举报
回复
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 楼主看有什么区别 吗
yulu27 2013-03-14
  • 打赏
  • 举报
回复
这是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));
yulu27 2013-03-14
  • 打赏
  • 举报
回复
引用 2 楼 a597926661 的回复:
楼主 但看那个for循环的话 楼主你认为什么情况下会再进toString(Obj)方法 只有在else的情况下才会进toString(Obj)方法 可能这样写就好了 Java code?1234567891011for (int i = 0; i < Array.getLength(obj); i++) { if(i > 0) ……
debug 开始就进else toString方法 但却一直循环
a597926661 2013-03-14
  • 打赏
  • 举报
回复
楼主 但看那个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);
					}
			}
yulu27 2013-03-14
  • 打赏
  • 举报
回复
52行 进debug看是继续执行for循环 为什么没重进方法?
yulu27 2013-03-14
  • 打赏
  • 举报
回复
顶一次...

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧