当前位置: 首页 > 知识库问答 >
问题:

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

韦知
2023-03-14

我对getFields方法和getDeclaredFields方法在使用Java反射时的区别有点困惑。

我读到GetDeclaredFields允许您访问类的所有字段,GetFields只返回公共字段。如果是这种情况,为什么不总是使用getDeclaredFields呢?

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

共有1个答案

沃弘图
2023-03-14

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检索字段。如果确实需要object字段,则可能为null

为了澄清,lists.newarraylist来自番石榴。

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

 类似资料:
  • 我对方法和方法在使用Java反射时的区别有点困惑。 我读到允许您访问类的所有字段,只返回公共字段。如果是这种情况,为什么不总是使用呢? 有没有人可以详细说明一下,解释一下这两种方法之间的区别,以及什么时候/为什么你要使用一种方法而不是另一种方法?

  • 问题内容: 我一直认为Java 中的运算符用于验证其两个布尔操作数是否均为,并且该&运算符用于对两种整数类型进行按位运算。 最近我知道,也可以使用运算符来验证其两个布尔操作数是否均为,唯一的区别是即使LHS操作数为false,它也会检查RHS操作数。 Java中的运算符是否在内部重载?还是在这背后有其他概念? 问题答案: <-验证两个操作数 <-停止评估第一个操作数是否为false,因为结果为fa

  • 问题内容: 什么是java反射,为什么有用? 问题答案: 名称反射用于描述能够检查同一系统(或本身)中其他代码的代码。 例如,假设你在Java中有一个未知类型的对象,并且你想在该对象上调用“ doSomething”方法(如果存在)。除非对象符合已知的接口,否则Java的静态类型化系统并不是真正为支持该类型而设计的,但是使用反射,你的代码可以查看该对象并确定其是否具有名为“ doSomething

  • 问题内容: 我只是想知道为什么我们通常在两个布尔之间使用逻辑OR 而不是按位OR ,尽管它们都运行良好。 我的意思是,请看以下内容: 我们可以代替使用吗?与和相同。 问题答案: 如果您使用和形式,而不是这些运算符的和形式,则Java不会费心地单独评估右手操作数。 这是您是否希望缩短评估时间的问题-在 大多数情况 下都是如此。 说明短路好处的一个好方法是考虑以下示例。 正如Jeremy和Peter提

  • 所谓反射,是java在运行时进行自我观察的能力,通过class、constructor、field、method四个方法获取一个类的各个组成部分。 在Java运行时环境中,对任意一个类,可以知道类有哪些属性和方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于反射机制。

  • 问题内容: 我在看一些模拟的OCJP问题。我遇到了一个非常令人困惑的语法。这里是: 为什么输出在和之间变化? 问题答案: 问题只是和您玩弄混乱的空格。 是通常的(不等于)比较。 另一方面: 最好写成如下形式: 因此,这是两个运算符。 首先反转。 然后将其分配回。 赋值运算符返回分配的值。因此,计算结果为true-这就是您要打印的内容。