除了java reflection api之外,有没有更好的方法来获取对象的字段getter,或者我滥用了PropertyDescriptor的getReadMethod?



上下文:

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

问题:

我还没有找到一种可行的方法来获取对象的字段值。我已经尝试将getter与java反射API一起使用,并使用类似于以下答案的https://stackoverflow.com/a/5503534/4807777findGetterName,findGetter但是,PropertyDescriptor的getName有时与从类的getDeclaredFields获得的字段名称大小写不同。

假设我通过将两个名称都大写来克服这一问题,getReadMethod仍然失败——似乎找不到使用is前缀的字段(即布尔字段)的getter。我不知道是我滥用了它,还是它是一个错误(调试getReadMethod似乎只适用于get前缀,尽管它似乎处理了布尔值的is前缀情况)。

考虑到字段在对象包之外是不可访问的,因此只能通过调用getter来访问。

有没有更好的方法来获取对象的字段getter,或者我缺少getter方法?


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

这修复了不同字母大小写的情况。然而,当不使用get前缀时,它仍然找不到它的readMethod。


已编辑-显示getReadMethod未按照Laszlo Lugosi的请求找到带前缀的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<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虽然我可以简单地按照Laszlo Lugosi强调的约定编写一个getReadMethod,但我更喜欢找到一个用于处理访问器的API。

由于您只知道对象字段名称,并且JavaBean有约定,因此可以很容易地计算getter。如果字段为布尔值,则规则为getUpperfieldname()和isUpperfieldename。您还可以从对象字段中找到返回类型。

相关内容

最新更新