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



我试图使用给定名称的反射找到private字段,该字段也可能驻留在父类或继承层次结构中的其他地方。

但是我发现在Class中没有提供这种信息的方法。

Class#getDeclaredFields() -提供private, public的所有字段,但不包含继承层次

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

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

我知道这很容易实现,有库提供这一点,但仍然可以包含在java本身。

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

当前的问题可以很容易地通过使用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;
    }
} 

另一篇文章提供了一种更复杂的方法,循环遍历类层次结构中的所有字段。

相关内容

  • 没有找到相关文章

最新更新