有没有比javareflectionapi更好的获取对象的字段getter的方法,或者我在使用PropertyDescriptor的getReadMethod?

语境:

我正在使用从SOAP服务端点接收的数据以通用方式构建Excel文档。 我以List的forms接收数据,并根据调用的方法为我收到的每个Object提供模型(JavaBeans)。 所以我将工作表的第一行设置为对象字段(getDeclaredFields)的标题。 然后我继续用对象列表中的值逐行填充列。

问题:

我还没有找到一种可行的方法来获取对象的字段值。 我已经尝试使用带有javareflectionAPI的getter,使用类似这样的答案的https://stackoverflow.com/a/5503534/4807777 findGetterName,findGetter但是PropertyDescriptor的getName有时候是一个与字段名称不同的字母大小写,从class的getDeclaredFields。

假设我通过大写两个名称来克服这个问题,getReadMethod stil失败 – 似乎没有为使用is前缀的字段(即布尔字段)找到getter。 我不知道我是否在滥用它或者它是一个错误(调试getReadMethod似乎只能使用get前缀,即使它似乎处理boole的is前缀情况)。

考虑到这些字段在对象包之外是不可访问的,因此仅通过调用getter来实现。

有没有更好的方法来获取对象的字段getter或我错过了getter方法的东西?


更新:当JavaBean属性映射到XML元素时,Spring的BeanUtils似乎更适合用它获取属性getPropertyDescriptors比java Class的getDeclaredFields更好。

这修复了不同的字母情况。 但是,当不使用get前缀时,它不会发现它是readMethod。


编辑 – 显示一个getReadMethod没有找到带前缀的getter的例子,正如Laszlo Lugosi所要求的那样。

一个简单的类:

class Test { private String assignmentType; private Boolean conserved; public String getAssignmentType() {return assignmentType;} public void setAssignmentType(String assignmentType) {this.assignmentType = assignmentType;} public Boolean isConserved() {return conserved;} public void setConserved(Boolean conserved) {this.conserved = conserved;} } 

使用上面链接的答案中编写的findGetter和findGetterName运行此命令:

 { Test obj = new Test(); obj.setAssignmentType("someType"); obj.setConserved(true); Field[] fields = obj.getClass().getDeclaredFields(); String fieldName; for (int i=0;i<fields.length;i++){ fieldName = fields[i].getName(); java.lang.reflect.Method method; Object val = null; try { method = obj.getClass().getMethod(findGetterName(obj.getClass(),fieldName)); val = method.invoke(obj); } catch (Exception e){ e.printStackTrace(); } } } 

编辑2虽然我可以简单地按照惯例编写一个getReadMethod Laszlo Lugosi强调我更喜欢找到一个用于处理访问器的API。

如您只知道对象字段名称,并且JavaBean具有约定,您可以轻松地找出getter。 如果field是boolean,则规则是getUpperfieldname()和isUpperfieldname。 您还可以从对象字段中找到返回类型。