为什么反射不提供查询继承层次结构中所有字段的方法?

时间:2013-04-11 10:42:38

标签: java reflection

我试图使用具有给定名称的反射来查找private字段,该字段也可能位于父类或继承层次结构中的其他位置。

但我发现Class中没有提供此信息的方法。

Class#getDeclaredFields() - 提供所有字段privatepublic包含继承层次结构

Class#getFields() - 包含继承层次结构,但仅搜索public个字段。

那么为什么没有提供这两种信息的方法呢?

我知道这很容易实现,并且有一些库提供了这个,但仍然可以包含在java本身中。

1 个答案:

答案 0 :(得分:0)

这是因为孩子class不知道父private中的任何class字段 - 它不会继承它们。

通过使用getSuperClass

走上班级层次结构,可以非常轻松地解决手头的问题
public static Field getField(final Class<?> toReflectOn, final String fieldName) throws NoSuchFieldException {
    try {
        return toReflectOn.getField(fieldName);
    } catch (NoSuchFieldException ex) {
        if (toReflectOn.getSuperclass() != null) {
            return getField(toReflectOn.getSuperclass(), fieldName);
        }
        throw ex;
    }
} 

This其他SO帖子提供了一种更复杂的方法,可以遍历类层次结构中的所有字段。