递归打印对象详细信息

时间:2010-10-11 10:34:09

标签: java recursion

如何递归打印对象的内容?

8 个答案:

答案 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.
}