当前位置: 首页 > 面试题库 >

除了java反射api以外,还有没有其他更好的方法来获取对象的字段getter,或者我滥用PropertyDescriptor的getReadMethod?

滑畅
2023-03-14
问题内容

内容:

我正在使用从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<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()和isUpperfieldname。您也可以从对象字段中找到返回类型。



 类似资料:
  • 问题内容: 我正在研究部分应用程序的使用情况,但是我只能找到有关使用专有sun实现或Oracle特定实现的信息。 sun的实现不受支持,并且可能会发生变化。如果将来我想将其部署到非Sun虚拟机上,使用此方法也可能会导致问题,最后,它在构建日志中留下了无法抑制的警告,可以掩盖其他警告。 我是否可以与我的应用程序一起部署一个开源替代实现,该实现在多个数据库之间都能很好地工作?至少支持MySQL的东西。

  • 问题内容: 所以可以说我有这个界面: 我有一个实现它的类: 如果我想使用接口IBox,则无法以这种方式实际创建它的实例: 对?所以我实际上必须这样做: 如果是这样,那么接口的唯一目的是确保实现接口的类中具有接口所描述的正确方法?还是接口还有其他用途? 问题答案: 接口是使代码更灵活的一种方法。你要做的是: 然后,稍后,如果你决定要使用其他类型的框(也许还有另一个库,其中框的类型更好),则将代码切换

  • 我发现这是一个私人领域,没有直接的方法来获得它。有办法出去吗?我使用jdk7。tks前进。

  • 假设我有一个用户模式/模型,用户有一个朋友列表。Mongoose希望您将好友列表(外键/ObjectID类型)存储为数组,对吗?这意味着如果我想通过ID找到我的朋友,Mongoose将搜索数组,直到找到具有我想要的ID的朋友的第一个实例。那似乎真的是时间低效,不是吗?有更好的办法吗?

  • 问题内容: 是否有一个很好的方法来Map 获取和忽略案件? 问题答案: TreeMap扩展了Map并支持自定义比较器。 字符串提供默认的不区分大小写的比较器。 所以: 比较器不考虑区域设置。在其JavaDoc中阅读有关它的更多信息。