对于使用Java反射时getFields
方法和getDeclaredFields
方法之间的区别,我有些困惑。
我读过getDeclaredFields
可让您访问该类的所有字段,并且getFields
仅返回公共(public)字段。如果是这种情况,为什么不总是使用getDeclaredFields
呢?
有人可以详细说明一下,并解释两种方法之间的区别,以及何时/为什么要在另一种方法上使用一种方法吗?
最佳答案
getFields()
整个类层次结构中的所有public
字段。
getDeclaredFields()
所有字段,无论其可访问性如何,仅适用于当前类,而不包括当前类可能继承的任何基类。
为了获得层次结构中的所有字段,我编写了以下函数:
public static Iterable<Field> getFieldsUpTo(@Nonnull Class<?> startClass,
@Nullable Class<?> exclusiveParent) {
List<Field> currentClassFields = Lists.newArrayList(startClass.getDeclaredFields());
Class<?> parentClass = startClass.getSuperclass();
if (parentClass != null &&
(exclusiveParent == null || !(parentClass.equals(exclusiveParent)))) {
List<Field> parentClassFields =
(List<Field>) getFieldsUpTo(parentClass, exclusiveParent);
currentClassFields.addAll(parentClassFields);
}
return currentClassFields;
}
提供
exclusiveParent
类可防止从Object
检索字段。如果您确实想要null
字段,则可能是Object
。为了澄清,
Lists.newArrayList
来自 Guava 。更新资料
仅供引用,以上代码已在GitHub上的LibEx的ReflectionUtils项目中发布。
关于java - Java反射中的getFields和getDeclaredFields有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16966629/