BeanUtils调用集合的size()方法(不是setter)

时间:2012-06-01 16:27:37

标签: java reflection apache-commons-beanutils

我有一个带有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获取商品的大小():

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

这基本上应该与:

相同
myAInstance.getOffers().size();

但是使用PropertyUtils不起作用并给我一个:

  

java.lang.NoSuchMethodException:类上的未知属性“size”   'class java.util.LinkedHashSet'

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

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

是否有另一种方法可以使用PropertyUtils /或BeanUtils(或Apache Commons的其他任何东西)来调用我的集合的size()方法?

由于 克里斯托弗

4 个答案:

答案 0 :(得分:3)

由于某种原因,PropertyUtils被命名为“PropertyUtils”。它适用于java bean约定。 “size()”方法不符合该约定,因此您不能将其称为属性。

也许你最好使用像MVEL或GroovyScript这样的东西,它支持属性导航和函数调用。这是一个适用于mvel的样本

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

试一试。

答案 1 :(得分:1)

一种解决方法(无法让它发挥作用)+我同意Dave'并不完全清楚为什么你想要'

将此添加到您的A类

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

然后使用

PropertyUtils.getProperty(myAInstance, "offerSize");

答案 2 :(得分:0)

不完全清楚为什么你想要,虽然它确实提供了一些关于反射API的薄包装。

您需要使用MethodUtils class,特别是invokeExactMethodinvokeMethod variants中的一个。

答案 3 :(得分: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));