内容:
我正在使用从SOAP服务端点接收到的数据以通用方式构建Excel文档。我以列表的形式接收数据,并且根据所调用的方法为每个接收到的对象提供了模型(JavaBeans)。因此,我将工作表的第一行设置为对象字段(getDeclaredFields)的标题。然后,我继续使用对象列表中的值逐行填充列。
问题:
我还没有找到一种获取对象的字段值的可行方法。我尝试将getter与Java反射API结合使用,
findGetterName,findGetter,但是PropertyDescriptor的getName有时与从类的getDeclaredFields。
假设我通过大写两个名称来克服了这个问题,getReadMethod stil失败-
似乎没有找到使用is前缀的字段(即布尔字段)的吸气剂。我不知道我是否在滥用它,或者它是一个错误(调试getReadMethod似乎只适用于get前缀,尽管它似乎可以处理布尔值的is前缀情况)。
考虑到该字段在对象包的外部是不可访问的,因此仅通过调用getter即可。
有没有更好的方法来获取对象的字段获取器,或者我缺少使用获取器方法的东西?
更新:当JavaBean属性映射到XML元素时,Spring的BeanUtils似乎更好地通过其 getPropertyDescriptors
获得属性,而优于Java类的 getDeclaredFields 。
这样可以解决不同的字母情况。但是,如果不使用get前缀,它仍未找到readMethod。
编辑-按照Laszlo Lugosi的要求,显示getReadMethod的示例未找到以getter为前缀的示例。
一个简单的类:
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
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虽然我可以按照Laszlo Lugosi强调的约定简单地编写getReadMethod,但我确实更喜欢找到用于处理访问器的API。