【问题标题】:Java Reflection - Get Fields From Sub Class as well as Super ClassJava 反射 - 从子类和超类中获取字段
【发布时间】:2017-05-08 21:36:54
【问题描述】:

我正在为我的项目使用继承的 bean 类。这里一些超类将为空,子类可以有字段,一些子类将为空,超类可以有字段。

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

下面我已经尝试实现了。但是我没有达到我的要求。请提供一些建议来实现这一目标。

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

如果我使用上面的代码,我只能得到超类字段

Field fields [] = obj.getClass().getFields();

如果我使用上面的代码,我可以从子类和超类字段中获取所有字段

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

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

【问题讨论】:

  • 如果遍历子类->超类链并收集字段呢?
  • 看起来你已经知道如何获取你想要的所有数据了,那有什么问题呢?如果您认为您应该能够在一个电话中获得所有信息,那可能是错误的。您可能需要进行多次调用,并且可能需要过滤掉一些数据。但我不明白您要完成什么以及为什么您的示例的某些组合不能实现这一点。
  • @ajb。我正在尝试对子类和超类字段进行一次调用。注意到您的观点并感谢您的回复。
  • @Lyubomyr Shaydariv.. 是的,我正在使用子类对象来获取子类和超类中的所有字段。

标签: java


【解决方案1】:

你必须遍历你的类的所有超类,像这样:

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());这一行的编译问题
  • List.addAll 不采用数组。使用Collections.addAll(result, i.getDeclaredFields());
  • 谢谢@jqno & @Klitos Kyriacou
  • 在你回答之后我执行了命令:System.out.println(Object.class.getSuperclass());如果有人也好奇,则值为 null
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
相关资源
最近更新 更多