天天看點

Java反射擷取實體的所有可見屬性值,傳回Object數組擷取實體的所有可見屬性值BeanUtils.describe實作本例的功能getFields()和getDeclaredFields()的差別BeanUtils.describe與PropertyUtils.describe差別BeanUtils.describe方法實作

以下代碼提供了兩種實作,一種是基于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