以下代碼提供了兩種實作,一種是基于List,一種是基于Map; 基于List的實作更節省記憶體,更高效一些;如果你有其它特殊的需求,可以根據實際參考以下代碼進行擴充,或許有需要用到Map的情況呢!
當然,使用BeanUtils.describe或PropertyUtils.describe一兩句代碼就搞定了,但還需要額外添加包引用;另外效率方面是不是更高呢?我沒有做過測試。
本例中使用getDeclaredFields,你可以參考與getFields差別,根據實際需求決定到底使用哪一個;
經過測試,該方法與本例代碼傳回的結果并不相同;
getFields()獲得某個類的所有的公共(public)的字段,包括父類。
getDeclaredFields()獲得某個類的所有申明的字段,即包括public、private和proteced,但是不包括父類的申明字段。
同樣類似的還有getConstructors()和getDeclaredConstructors(),getMethods()和getDeclaredMethods()。
這兩個方法,基本上實作原理類似,内部代碼很多都相同的,但在讀取bean的某個屬性的時候都是調用的某個類的getNestedProperty(bean, name)方法。
其實主要的差別就在這個方法中
PropertyUtils是調用的PropertyUtilsBean的這個方法,該方法讀取屬性值(調用getXxx方法)之後,value不做轉化
而BeanUtils調用的是BeanUtilsBean的這個getNestedProperty方法,該方法在讀取值之後,會再調用一次(getConvertUtils().convert(value));,進行類型轉化成String。
是以BeanUtils.describe轉化出來的Map的value都是String