2012-06-01 32 views
2

我有一個getter和setter類:BeanUtils的調用集合的size()方法(這是不是setter)

class A 
{ 
    private Set<Offers> offers; 

    public Set<Offers> getOffers(){ 
    return offers; 
    } 

    public void setOffers(Set<Offers> offers){ 
    this.offers = offers; 
    } 

} 

現在我希望得到報價的大小()使用Apache共享PropertyUtils:

PropertyUtils.getProperty(myAInstance, "offers.size"); 

這應該基本上做的是一樣的:

myAInstance.getOffers().size(); 

但使用PropertyUti LS不工作,並給了我一個:

java.lang.NoSuchMethodException:未知屬性 '大小' 階級 '類java.util.LinkedHashSet'

使用PropertyUtils所有getter和其他對象上的setter工作正常。

我懷疑這是因爲Collection的size()方法沒有遵循getXXX和setXXX bean約定。

是否有另一種方法來使用PropertyUtils /或BeanUtils(或Apache Commons的其他任何方法)來調用我的集合的size()方法?

感謝 克里斯托夫

回答

3

PropertyUtils被命名爲「PropertyUtils」是有原因的。它適用於Java bean約定。 「size()」方法不符合該約定,因此您不能將其作爲屬性引用。

也許你更喜歡MVEL或GroovyScript,它同時支持屬性導航和函數調用。下面是MVEL樣品應工作

Integer size = (Integer) MVEL.eval("offers.size()", instanceOfA); 

試試看吧。

+0

是的,我知道MVEL不是apache的常用軟件,但它使用的是Apache 2.0許可證,這正是所有常見軟件包應該使用的,我相信。 – Matt

+0

謝謝,我意識到表達式語言更多的是我正在尋找的東西,而且我期望PropertyUtils的錯誤。我會給MVEL一個嘗試。 – Christoph

0

尚不完全清楚爲什麼你要來,但它確實提供周圍反射API一些薄的餃子皮。

你會想要使用MethodUtils class,具體是invokeExactMethodinvokeMethod variants之一。

+0

嗯似乎MethodUtils和invokeMethod變體不支持方法的嵌套定義。我想能夠說invokeMethod(「offers.size」),我希望它調用兩個方法getOffers()。getSize(),兩個方法都沒有任何參數。但是這也給了我一個:沒有這種可訪問的方法:對象上的offers.size() – Christoph

+0

@Christoph它不是一種表達式語言,除了OGNL(現在是一個Apache項目)和JSP EL的東西,我不知道任何在Commons中都是。在一個簡單的效用方法中結合bean utils和property utils真的很難嗎?或者,你應該採取另一種方法,如腳本。 –

+0

好的,謝謝Dave。 「表達語言」的方式來看待它是有道理的。嗯好吧,我想起初我會採用D3mon-1stVFW的解決方法,並嘗試使用Matt提到的MVEL。我認爲MVEL更符合我的需求。關於Property/BeanUtils的組合:它不是太難(我已經黑了它......),但認爲這個功能已經提供,但也許我是盲目找到它...... :)謝謝 – Christoph

1

變通的辦法(無法得到它的工作)+我與戴維同意「不完全清楚爲什麼你會想」

添加到您的類

public int getOfferSize(){ 
    return offers == null ? 0 : offers.size(); 
} 

然後使用

PropertyUtils.getProperty(myAInstance, "offerSize"); 
+0

+1;微不足道的解決方法,德米特會欣喜若狂。 –

0

你可以直接通過舊的反射來做到這一點,避免任何圖書館。

首先,你得到的吸氣劑:

Method get = A.class.getDeclaredMethod("getOffers"); 

現在你調用獲取並獲得代表集中的對象。然後創建代表在設置中定義的尺寸方法的新方法:

Object setFromA= get.invoke(yourAObject); 
Method size = Set.class.getDeclaredMethod("size"); 

最後,你投上setFromA的方法,並獲得大小,鑄造你的setFromA對象所需的類型:

Integer listSize = (Integer) size.invoke(get.getReturnType().cast(setFromA)); 
+0

是的,這就是我現在的做法,但我喜歡PropertyUtils的嵌套屬性語法,因爲90%的東西是getter/setter。我將堅持getters/setters或嘗試一種表達式語言,如MVEL。 – Christoph

相關問題