gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:38:20 25 4
gpt4 key购买 nike

上下文:

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

问题:

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

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

考虑到这些字段无法在对象包之外访问,因此只能通过调用 getter 来访问。

是否有更好的方法来获取对象的字段 getter,或者我在 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。如果字段为 boolean 值,则规则为 getUpperfieldname() 和 isUpperfieldname。您还可以从对象字段中找出返回类型。

关于java - 除了java反射api之外,是否有更好的方法来获取对象的字段 getter ,或者我滥用了PropertyDescriptor的getReadMethod?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29771370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com