我对使用Java反射时getFields方法和方法之间的区别感到有些困惑。getDeclaredFields
getFields
getDeclaredFields
我读到它getDeclaredFields使您可以访问该类的所有字段,并且 getFields只返回公共字段。如果是这种情况,你为什么不总是使用getDeclaredFields?
有人可以详细说明一下,并解释这两种方法之间的区别,以及何时/为什么要使用其中一种方法?
获取字段()
public整个类层次结构中的所有字段。
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字段,则可能是这样。
exclusiveParent
Object
null
澄清一下,Lists.newArrayList来自番石榴。
Lists.newArrayList
仅供参考,上面的代码发布在我的LibEx项目中的 GitHub 上ReflectionUtils。