2012-02-11 32 views
2

在Java中是否有能夠獲得類的字段,方法和註釋的類,包括那些來自超類緩存的結果?用於Java自省的庫

編輯 好象春天到了每一個主要的框架,休眠,傑克遜的確某種深刻反省的,我想知道是否有東西在這些庫,我可以使用。

+5

我不明白,還有什麼你不需要用Java反射提供? – madth3 2012-02-11 00:54:17

+0

我已經寫了幾次代碼,只是想看看是否有一個車輪已經做出。 – ltfishie 2012-02-11 01:02:19

+2

反射*是車輪。你並不需要做任何額外的「緩存」(除非捕獲所有的'NoSuchMethodException's和什麼都不太煩人)。 – ruakh 2012-02-11 01:06:47

回答

6

嗯,我找到了我要尋找一個在春天的BeanWrapper:

final BeanWrapper sourceBean = new BeanWrapperImpl(MyType.class); 
final PropertyDescriptor[] propertyDescriptors = sourceBean.getPropertyDescriptors(); 
for (final PropertyDescriptor propertyDescriptor : propertyDescriptors) { 
    logger.info(propertyDescriptor.getName() + ":" + propertyDescriptor.getPropertyType()); 
} 

隨着BeanWrapper接口可以訪問到所有領域,setter和getter,註解。每個班級也被緩存。

2

您可能也有興趣Commons BeanUtils。它提供了一套很好的助手,可以輕鬆地進行自我反省(主要是Java bean屬性)。

1

Spring Framework的BeanWrapper在版本3之後有了很大的改進,這是一個事實。但是如果你想要一個更高性能的BeanWrapper,你可能想要考慮juffrou-reflect的BeanWrapper--它在實例化時更加高效,在設置和獲取值和類型方面更具性能。而且它比Spring更靈活。

當然,我有偏見,因爲我開發了Juffrou--反映了我自己,但我認爲你可以從我的BeanWrapper中獲得更多。當Spring的BeanWrapper版本爲2.x時,我開始開發它,並且從那以後我一直沒有讓它開發。它也是開源的,所以你完全可以自由使用和修改。

這是一個例子用例:

BeanWrapper beanWrapper = new BeanWrapper(BeanWrapperContext.create(Programmer.class)); // Programmer extends Person 
beanWrapper.setValue("specialization", "Bean Wrappers :)"); // set value to Programmer's property 
beanWrapper.setValue("firstName", "Carlos"); // set value to Person's property 
beanWrapper.setValue("home.town", "Lisboa");  // set value to a nested bean's property 
for(String propertyName : beanWrapper.getPropertyNames()) { 
    Type type = beanWrapper.getType(propertyName); 
    Object value = beanWrapper.getValue(propertyName); 
    Logger.debug(type + ": " + value); 
} 
Programmer programmer = (Programmer) beanWrapper.getBean(); // get the wrapped object 
BeanWrapperContext context = beanWrapper.getContext(); // Reuse the context and save on introspection overhead 

你可以在http://juffrou.sourceforge.net檢查出來。還有一個全面的PDF手冊和javadoc,所以你可以從一開始就充分發揮它的潛力。但如果您有任何關於它的使用問題,我會很樂意回覆。

乾杯

卡洛斯

+0

嗨!快速提問。您的框架可以用於多線程場景嗎?是否有任何文檔可用於哪些類和方法是線程安全的/不安全的?謝謝! – 2014-04-21 16:21:12

+0

嗨!感謝您的詢問。我還沒有創建任何特定的測試來探測多線程場景中的併發,但是我相信多線程和juffrou-reflect是可以的。所有BeanWrapper都是單獨的獨立實例。只有靜態元數據的上下文是共享的,所以我認爲它是安全的。與此同時,我將項目移至Github(http://cemartins.github.io/juffrou),並且我正在積極地繼續在那裏發展。任何反饋都會很棒。 – Martins 2014-04-21 20:11:44