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)