在使用Java反射时,我对getFields方法和getDeclaredFields方法之间的区别感到有点困惑.

我读到getDeclaredFields允许你访问类的所有字段,而getFields只返回公共字段.如果是这样的话,你为什么不总是用getDeclaredFields呢?

有人能详细说明一下这一点,并解释这两种方法之间的区别,以及何时/为什么你想使用一种方法而不是另一种方法?

推荐答案

100

整个类层次 struct 上的所有public个字段.

100

所有字段,与其可访问性无关,但仅适用于当前类,而不适用于当前类可能继承的任何基类.

要使所有字段在层次 struct 中向上移动,我编写了以下函数:

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检索字段.如果你想要Object个字段,可能是null.

澄清一下,Lists.newArrayList个来自番石榴.

使现代化

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

Java相关问答推荐

java.lang. StackOverFlow错误:显示表及其依赖项时为空

如果给定层次 struct 级别,如何从其预序穿越构造n元树

CriteriaQuery with max

如何在Javascript中设置文本区域圆角的样式

Java List with all combinations of 8 booleans

JVM会优化这个数学运算吗?

对于几乎不涉及逻辑的请求,您是否应该使用命令模式?

将不受支持的时区UT重写为UTC是否节省?

Jakarta CDI强制bean构造/注册遗留事件侦听器

Helidon 4和Http API

JDK 21-为什么线程局部随机S nextInt不直接用Super.nextInt实现?

如何将其他属性引用到log4j2 yaml配置中?

为什么我的回收视图会显示重复的列表?

将JSON字符串转换为Java类

try 使用Spring集成和MySQL实现发件箱模式时,锁定等待超时

如何用内置Java从JavaFX应用程序中生成.exe文件?

如何调整JButton的大小以适应图标?

在Oracle中调用输出参数在索引处缺少IN或OUT参数的函数

OAuth:登录后无法查看Google邮箱地址

JOOQ:批处理CRUD操作使用动态表定义,如何?