是否有比 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 类型。