如何递归打印对象的内容?
答案 0 :(得分:12)
您可以通过覆盖所有课程中的toString
来递归打印。
如果你想拥有像printObjectRecursively(Object o)
这样的方法,你需要深入反思,获取字段,使用printObjectRecursively(someField)
递归打印他们的名字和内容。
示例:
public class Test {
public static void main(String[] args) {
A a = new A();
System.out.println(a);
}
}
class A {
int i = 5;
B obj = new B();
String str = "hello";
public String toString() {
return String.format("A: [i: %d, obj: %s, str: %s]", i, obj, str);
}
}
class B {
int j = 17;
public String toString() {
return String.format("B: [j: %d]", j);
}
}
打印:
A: [i: 5, obj: B: [j: 17], str: hello]
基于反射的递归打印方法可以写成这样的
private static final List LEAVES = Arrays.asList(
Boolean.class, Character.class, Byte.class, Short.class,
Integer.class, Long.class, Float.class, Double.class, Void.class,
String.class);
public static String toStringRecursive(Object o) throws Exception {
if (o == null)
return "null";
if (LEAVES.contains(o.getClass()))
return o.toString();
StringBuilder sb = new StringBuilder();
sb.append(o.getClass().getSimpleName()).append(": [");
for (Field f : o.getClass().getDeclaredFields()) {
if (Modifier.isStatic(f.getModifiers()))
continue;
f.setAccessible(true);
sb.append(f.getName()).append(": ");
sb.append(toStringRecursive(f.get(o))).append(" ");
}
sb.append("]");
return sb.toString();
}
答案 1 :(得分:1)
您可以使用:
ToStringBuilder.reflectionToString(this);
Apache Common Lang包含ToStringBuilder
类。您可以使用ToStringStyle
对象定义不同的样式。
答案 2 :(得分:0)
您应该为您的类实现toString
方法 - 它将打印有关类成员的信息 - 通常使用他们的toString
方法。 |然后你jut遍历集合并调用每个项目的toString
答案 3 :(得分:0)
你真的需要打印这些信息吗?也许在调试期间观看就足够了?
答案 4 :(得分:0)
您正在寻找类似于PHP var_dump的内容,请查看此问题是否有任何帮助:What is the Java equivalent of PHP var_dump?
另外,请看一下反思:http://java.sun.com/developer/technicalArticles/ALT/Reflection/
答案 5 :(得分:0)
您可以覆盖toString方法。
示例:强>
class foo
{
int i,j;
String toString()
{
StringBuilder b=new StringBuilder();
return b.append(i).append(j).toString();
}
}
答案 6 :(得分:0)
使用其中一个序列化库,如Jackson(JSON)。
这会以纯文本格式转储所有内容。如果您使用具有Javascript功能的编辑器来美化内容,运气好的话,您可能会对它有所了解。
如果很多对象都不是可序列化的,那么你很可能最终会有很多可读的乱码,不幸的是,
YMMV
答案 7 :(得分:0)
我在休闲的基础上使用XStream转储对象的JSON表示非常成功。它可以减少对象,并且似乎只是做你想要它在大多数时间做的事情。它超轻量级。例如:
private static final XStream jsonXStream =
new XStream(new JsonHierarchicalStreamDriver());
public static String toDebugString(Object object) {
return jsonXStream.toXML(object);
// ignore "toXML" name, it's going to be JSON.
}