我有一个带有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()方法?
由于 克里斯托弗
答案 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,特别是invokeExactMethod
或invokeMethod
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));