对于使用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上的LibExReflectionUtils项目中发布。

关于java - Java反射中的getFields和getDeclaredFields有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16966629/

10-11 02:36