小编典典

Java反射中getFields和getDeclaredFields有什么区别

all

我对使用Java反射时getFields方法和方法之间的区别感到有些困惑。getDeclaredFields

我读到它getDeclaredFields使您可以访问该类的所有字段,并且
getFields只返回公共字段。如果是这种情况,你为什么不总是使用getDeclaredFields

有人可以详细说明一下,并解释这两种方法之间的区别,以及何时/为什么要使用其中一种方法?


阅读 72

收藏
2022-06-11

共1个答案

小编典典

获取字段()

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来自番石榴。

更新

仅供参考,上面的代码发布在我的LibEx项目中的 GitHub
ReflectionUtils

2022-06-11