2

ゲッターとセッターのクラスがあります。

class A
{
  private Set<Offers> offers;

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

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

}

ここで、Apache Commons PropertyUtilsを使用してオファーのsize()を取得したいと思いました。

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

これは基本的に次のように実行する必要があります。

myAInstance.getOffers().size();

しかし、PropertyUtilsを使用しても機能せず、次のようになります。

java.lang.NoSuchMethodException:クラス'クラスjava.util.LinkedHashSet'の不明なプロパティ'サイズ'

他のオブジェクトのすべてのゲッターとセッターにPropertyUtilsを使用すると、正常に機能します。

コレクションのsize()メソッドがgetXXXおよびsetXXXBeanの規則に準拠していないことが原因であると思われます。

PropertyUtils /またはBeanUtils(またはApache Commonsの他のもの)を使用してコレクションのsize()メソッドを呼び出す別の方法はありますか?

ありがとうクリストフ

4

4 に答える 4

3

PropertyUtilsは、理由から「PropertyUtils」と名付けられています。これは、JavaBeansの規則で機能します。「size()」メソッドはその規則に準拠していないため、プロパティとして参照することはできません。

おそらく、プロパティナビゲーションと関数呼び出しの両方をサポートするMVELやGroovyScriptのようなものを使用したほうがよいでしょう。これが動作するはずのmvelのサンプルです

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

試してみる。

于 2012-06-01T17:12:55.783 に答える
1

それを回避する方法(それを機能させることができませんでした)+私はデイブに同意します'なぜあなたがしたいのか完全には明確ではありません'

これをAクラスに追加します

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

次に、

PropertyUtils.getProperty(myAInstance, "offerSize");
于 2012-06-01T17:00:34.190 に答える
0

リフレクションAPIの周りにいくつかの薄いラッパーを提供しますが、なぜそうしたいかは完全には明確ではありません。

MethodUtilsクラス、具体的にはinvokeExactMethodまたはinvokeMethodバリアントの1つを使用することをお勧めします。

于 2012-06-01T16:40:46.880 に答える
0

これは、ライブラリを避けて、古き良きリフレクションを介して直接行うことができます。

まず、ゲッターを取得します。

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

ここで、ゲッターを呼び出して、セットを表すオブジェクトを取得します。次に、Setで定義されたサイズメソッドを表す新しいメソッドを作成します。

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

最後に、setFromAにメソッドをキャストしてサイズを取得し、setFromAオブジェクトを必要なタイプにキャストします。

Integer listSize = (Integer) size.invoke(get.getReturnType().cast(setFromA));
于 2012-06-01T17:31:20.760 に答える