作java软件开发的人确定会常常要调试代码,把整个对象的每个属性都打印出来,但调用全部的对应属性的get方法又实在太过于繁琐,因而但愿有没有什么工具能直接用一个方法就实现这个功能,因而就出现了ToStringBuilder这个工具类,这个工具类能够优雅方便的打印出某个对象的全部属性性。html
对于简单的类,ToStringBuilder很是好用,然而若是被打印的对象很是复杂,好比多个list嵌套,则ToStringBuilder就不起做了,对象内容嵌入的复杂对象没法被打印出来。因而为了解决这个问题,哥花了个把小时,写了个可以递归打印内部复杂对象的ToStringbuilder。虽然基本要求是实现了,但貌似打印出来的的样式实在太过于丑陋,有时间再改吧。若是有什么相关需求,请留言,哥必定第一时间知足你。java
import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; public class ToStringBuilderRecursive { 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,Date.class); private static String delimitor = "\n"; public static String toStringRecursive(Object o){ if (o == null) return "null"+delimitor; if (LEAVES.contains(o.getClass())) return o.toString()+delimitor; if(o.getClass().isArray()){ Object[] oa = (Object[]) o; StringBuffer sb = new StringBuffer(); sb.append("["); for(int i =0;i<oa.length;i++) sb.append(toStringRecursive(oa[i])); sb.append("]"+delimitor); return sb.toString(); } new ArrayList().getClass().getDeclaredFields(); 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(": "); try { sb.append(toStringRecursive(f.get(o))).append(" "); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } sb.append("]"+delimitor); return sb.toString(); } public static void main(String[] agr){ A a = new A(); String str = ToStringBuilderRecursive.toStringRecursive(a); System.out.println(str); } } class A{ List list = Arrays.asList("a","b","c","d"); Date date = new Date(); Long len = 111l; String outerojb = "outerobj"; }