【发布时间】:2021-11-09 18:10:59
【问题描述】:
我们正在从 DTO 类创建 CSV 文件,使用反射来获取所有列名的名称。 ClassName.class.getDeclaredFields() 为我们提供了所有列名的数组。
我们有一个用例,我们有具有组合关系的类,如下所示:
public class Book {
private String title;
private Author author;
}
public class Author {
private String name;
private Integer age:
}
这里的 Book 是根类,即最终的 CSV 将被命名为 books.csv
使用Book.class.getDeclaredFields(),我们只获取字段名称title 和author,但我们还想要来自Author 类的字段名称(姓名和年龄),有没有办法得到这些?
【问题讨论】:
-
Author.class.getDeclaredFields()不起作用吗?或者您是否正在寻找一个不涉及知道author在Book中的类型的解决方案? -
永远不要使用 'int' 或 'Integer' 年龄。只存储生日。与年龄不同,它不会每年都在变化,您可以根据它完美地找到年龄。 name 和 age 不是 Book 的一部分,那么它为什么会返回它呢?既然作者的类型不固定,那么这个过程怎么能分辨出来呢?
-
@bob 您可以使用
field.getType().isPrimitive()检查Field是否为原始类型。如果它不是原始的,您再次调用field.getType().getDeclaredFields()。这可能必须为每个子类型递归地完成。 -
@bob
isPrimitive()将为字符串返回 false。所以你可能必须这样做:var type = field.getType(); if(type.isPrimitive() || type.isAssignableFrom(String.class)) {...}还要检查它是否是一个字符串。还要涵盖包装类,请参阅this post。 -
@AmalK
type.isAssignableFrom(String.class)将是true如果type是Object。也许,你只是想要type == String.class。
标签: java reflection