作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"; }