Class.getFields()直接获取当前类及所有父类中声明为public的字段(含接口的public static final字段),不包含private、protected或包级私有字段,也无需手动遍历父类。

Class.getFields() 方法本身就能获取当前类及其所有父类中声明为 public 的字段(包括从接口继承的),**不需要手动遍历父类**。它返回的是一个 Field[] 数组,包含所有可访问的 public 字段(含继承的),但**不包含 private、protected 或 package-private 字段**。
getFields() 的作用范围
该方法遵循 Java 的访问规则,只返回那些在运行时能被“反射访问”的 public 字段:
- 当前类中声明的
public字段 - 直接父类中声明的
public字段 - 祖父类、更高层父类中声明的
public字段(只要可访问) - 实现的接口中定义的
public static final字段(接口字段默认就是 public static final)
与 getDeclaredFields() 的关键区别
容易混淆的是 getDeclaredFields() —— 它只返回当前类**自己声明**的所有字段(无论访问修饰符),但不包括任何继承来的字段:
-
getFields()→ 所有可访问的 public 字段(含继承) -
getDeclaredFields()→ 当前类声明的全部字段(不含继承,含 private/protected)
实际使用示例
假设有如下类结构:
class A { public int a = 1; }
class B extends A { public int b = 2; }
class C extends B { public int c = 3; }
执行 C.class.getFields() 会返回长度为 3 的数组,包含字段 a、b、c(都是 public 且可继承)。
如果某个父类字段是 protected 或 private,它不会出现在 getFields() 结果中 —— 这是设计使然,不是 bug。
注意:无法通过 getFields() 获取非 public 字段
如果你需要获取包括 protected/private 的所有继承字段,Java 反射没有直接 API。必须手动向上遍历类层次:
- 调用
getDeclaredFields()获取当前类字段 - 调用
getSuperclass()获取父类,再对其调用getDeclaredFields() - 递归或循环直到
getSuperclass() == null - 自行过滤出需要的访问级别(如只取 public + protected)
但这是额外逻辑,getFields() 本身不提供此能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











