2

我有一个带有 getter 和 setter 的类:

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:类'class java.util.LinkedHashSet'上的未知属性'size'

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

我怀疑这是因为 Collection 的 size() 方法没有遵循 getXXX 和 setXXX bean 约定。

还有其他方法可以使用 PropertyUtils / 或 BeanUtils(或 Apache Commons 中的其他任何东西)来调用我的集合的 size() 方法吗?

谢谢克里斯托夫

4

4 回答 4

3

PropertyUtils 被命名为“PropertyUtils”是有原因的。它适用于 Java bean 约定。“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

您可以直接通过良好的旧反射来做到这一点,避免使用任何库。

首先,你得到了吸气剂:

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

现在调用 getter 并获取表示集合的对象。然后创建一个新的 Method 来表示 Set 中定义的 size 方法:

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 回答
0

不完全清楚您为什么要这样做,尽管它确实提供了一些围绕反射 API 的薄包装器。

您将需要使用MethodUtils该类,特别是其中一个invokeExactMethodinvokeMethod变体

于 2012-06-01T16:40:46.880 回答