递归打印对象详细信息

tom*_*tom 7 java recursion

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

aio*_*obe 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

打印:

A: [i: 5, obj: B: [j: 17], str: hello]
Run Code Online (Sandbox Code Playgroud)

基于反射的递归打印方法可以写成这样的东西

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();
}
Run Code Online (Sandbox Code Playgroud)


小智 6

Apache Common Lang包含ToStringBuilder类。您可以使用ToStringStyle对象定义不同的样式。

单行递归:

ToStringBuilder.reflectionToString(obj, new RecursiveToStringStyle())
Run Code Online (Sandbox Code Playgroud)

树状递归:

ToStringBuilder.reflectionToString(obj, new MultilineRecursiveToStringStyle())
Run Code Online (Sandbox Code Playgroud)