Java反射 - 如何获取子类以及父类的字段

6

我正在使用继承的bean类来进行我的项目。在这里,有些超级类将是空的,而子类可以拥有字段,并且有些子类也将是空的,但是超类可以拥有字段。

我的要求是从子类获取所有私有/公共字段,以及从超类获取所有公共/受保护字段。

下面是我尝试实现它的代码。但是我未能满足我的需求。请提供一些建议来实现这个功能。

Field fields [] = obj.getClass().getSuperclass().getDeclaredFields();

如果我使用以上代码,我只能获取超类的字段。
Field fields [] = obj.getClass().getFields();

如果我使用上述代码,我可以获取子类和父类字段的所有字段。
Field fields [] = obj.getClass().getDeclaredFields();

如果我使用上述代码,我可以获得子类的公共和私有字段。

如果您沿着子类->超类的链条迭代并收集字段,会怎样呢? - Lyubomyr Shaydariv
2
看起来你已经知道如何获取所有想要的数据,那么问题是什么?如果你认为应该能够在一个调用中获取所有数据,那可能是错误的。你可能需要进行多次调用,并且可能需要过滤掉一些数据。但我不明白你试图实现什么以及为什么你的示例组合没有实现它。 - ajb
@ ajb。我正在尝试在一个调用中获取子类和超类字段。注意到了你的观点,谢谢你的回复。 - deadend
@ Lyubomyr Shaydariv.. 是的,我正在使用子类对象来获取子类和父类中的所有字段。 - deadend
1个回答

7
您需要遍历您的类的所有超类,方法如下:
private List<Field> getInheritedPrivateFields(Class<?> type) {
    List<Field> result = new ArrayList<Field>();

    Class<?> i = type;
    while (i != null && i != Object.class) {
        Collections.addAll(result, i.getDeclaredFields());
        i = i.getSuperclass();
    }

    return result;
}

在这一行编译出现问题:result.addAll((i.getDeclaredFields()); - deadend
List.addAll不接受数组。请使用Collections.addAll(result, i.getDeclaredFields()); - Klitos Kyriacou
感谢 @ jqno 和 @ Klitos Kyriacou。 - deadend
在你回答后,我执行了命令:System.out.println(Object.class.getSuperclass()); 如果有人也感到好奇,那么输出的值是null。 - Marcos Vasconcelos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接