是否有比 java 反射 api 更好的方法来获取 object 的字段获取器,或者我误用了 PropertyDescriptor 的 getReadMethod?
Is there a better way of obtaining an object's field getters other than java reflection api or i am misusing PropertyDescriptor's getReadMethod?
上下文:
我正在使用从 SOAP 服务端点接收的数据以通用方式构建一个 Excel 文档。我将数据作为列表接收,并且根据调用的方法接收到的每个 Object 都有模型(JavaBeans)。
因此,我将 sheet 的第一行设置为 object 字段 (getDeclaredFields) 中的 header。
然后我继续用 objects.
列表中的值逐行填充该列
问题:
我还没有找到获取 object 字段值的可行方法。
我尝试将 getters 与 java 反射 API 与类似此答案的 findGetterName , findGetter 的东西一起使用,但是 PropertyDescriptor 的 getName 有时与该字段的字母大小写不同从 class 的 getDeclaredFields 获得的名称。
假设我通过将两个名称都大写来克服这个问题,getReadMethod 仍然失败 - 似乎没有为使用 is 前缀的字段(即布尔字段)找到 getters。我不知道我是在滥用它还是它是一个错误(调试 getReadMethod 似乎只适用于 get 前缀,即使它似乎处理布尔值的 is 前缀情况)。
考虑到这些字段在 object 包之外是不可访问的,因此只能通过调用 getters.
是否有更好的方法来获取 object 的字段 getter,或者我在 getter 方法中遗漏了什么?
更新:Spring 的 BeanUtils 似乎更适合使用它的 getPropertyDescriptors 获取属性,优于 java Class 的 getDeclaredFields,当 JavaBean 属性映射到 XML 个元素时。
这修复了不同字母大小写的情况。然而,当不使用 get 前缀时,它仍然找不到它的 readMethod。
已编辑 - 显示 getReadMethod 未找到前缀 getter 的示例,如 Laszlo Lugosi 所要求的。
一个简单的class:
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有约定,你可以很容易地找出getters。如果字段是布尔值,则规则是 getUpperfieldname() 和 isUpperfieldname。您也可以从对象字段中找出 return 类型。
上下文:
我正在使用从 SOAP 服务端点接收的数据以通用方式构建一个 Excel 文档。我将数据作为列表接收,并且根据调用的方法接收到的每个 Object 都有模型(JavaBeans)。 因此,我将 sheet 的第一行设置为 object 字段 (getDeclaredFields) 中的 header。 然后我继续用 objects.
列表中的值逐行填充该列问题:
我还没有找到获取 object 字段值的可行方法。 我尝试将 getters 与 java 反射 API 与类似此答案的 findGetterName , findGetter 的东西一起使用,但是 PropertyDescriptor 的 getName 有时与该字段的字母大小写不同从 class 的 getDeclaredFields 获得的名称。
假设我通过将两个名称都大写来克服这个问题,getReadMethod 仍然失败 - 似乎没有为使用 is 前缀的字段(即布尔字段)找到 getters。我不知道我是在滥用它还是它是一个错误(调试 getReadMethod 似乎只适用于 get 前缀,即使它似乎处理布尔值的 is 前缀情况)。
考虑到这些字段在 object 包之外是不可访问的,因此只能通过调用 getters.
是否有更好的方法来获取 object 的字段 getter,或者我在 getter 方法中遗漏了什么?
更新:Spring 的 BeanUtils 似乎更适合使用它的 getPropertyDescriptors 获取属性,优于 java Class 的 getDeclaredFields,当 JavaBean 属性映射到 XML 个元素时。
这修复了不同字母大小写的情况。然而,当不使用 get 前缀时,它仍然找不到它的 readMethod。
已编辑 - 显示 getReadMethod 未找到前缀 getter 的示例,如 Laszlo Lugosi 所要求的。
一个简单的class:
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有约定,你可以很容易地找出getters。如果字段是布尔值,则规则是 getUpperfieldname() 和 isUpperfieldname。您也可以从对象字段中找出 return 类型。