BeanUtils的调用集合的size()方法(这是不是setter)
我有一个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()方法?
感谢 克里斯托夫
PropertyUtils被命名为“PropertyUtils”是有原因的。它适用于Java bean约定。 “size()”方法不符合该约定,因此您不能将其作为属性引用。
也许你更喜欢MVEL或GroovyScript,它同时支持属性导航和函数调用。下面是MVEL样品应工作
Integer size = (Integer) MVEL.eval("offers.size()", instanceOfA);
试试看吧。
尚不完全清楚为什么你要来,但它确实提供周围反射API一些薄的饺子皮。
你会想要使用MethodUtils
class,具体是invokeExactMethod
或invokeMethod
variants之一。
嗯似乎MethodUtils和invokeMethod变体不支持方法的嵌套定义。我想能够说invokeMethod(“offers.size”),我希望它调用两个方法getOffers()。getSize(),两个方法都没有任何参数。但是这也给了我一个:没有这种可访问的方法:对象上的offers.size() – Christoph
@Christoph它不是一种表达式语言,除了OGNL(现在是一个Apache项目)和JSP EL的东西,我不知道任何在Commons中都是。在一个简单的效用方法中结合bean utils和property utils真的很难吗?或者,你应该采取另一种方法,如脚本。 –
好的,谢谢Dave。 “表达语言”的方式来看待它是有道理的。嗯好吧,我想起初我会采用D3mon-1stVFW的解决方法,并尝试使用Matt提到的MVEL。我认为MVEL更符合我的需求。关于Property/BeanUtils的组合:它不是太难(我已经黑了它......),但认为这个功能已经提供,但也许我是盲目找到它...... :)谢谢 – Christoph
变通的办法(无法得到它的工作)+我与戴维同意“不完全清楚为什么你会想”
添加到您的类
public int getOfferSize(){
return offers == null ? 0 : offers.size();
}
然后使用
PropertyUtils.getProperty(myAInstance, "offerSize");
+1;微不足道的解决方法,德米特会欣喜若狂。 –
你可以直接通过旧的反射来做到这一点,避免任何图书馆。
首先,你得到的吸气剂:
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));
是的,这就是我现在的做法,但我喜欢PropertyUtils的嵌套属性语法,因为90%的东西是getter/setter。我将坚持getters/setters或尝试一种表达式语言,如MVEL。 – Christoph
是的,我知道MVEL不是apache的常用软件,但它使用的是Apache 2.0许可证,这正是所有常见软件包应该使用的,我相信。 – Matt
谢谢,我意识到表达式语言更多的是我正在寻找的东西,而且我期望PropertyUtils的错误。我会给MVEL一个尝试。 – Christoph