我试图使用给定名称的反射找到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;
}
}
另一篇文章提供了一种更复杂的方法,循环遍历类层次结构中的所有字段。