class.getdeclaredfields()返回当前类显式声明的所有字段(含public、protected、private、package-private),不包含父类或接口字段;返回field[]数组,顺序不保证与源码一致。

Class.getDeclaredFields() 会返回当前类**显式声明**的所有字段(包括 public、protected、private 和 package-private),但**不包含继承自父类或接口的字段**。
关键点说明
这个方法只关注“本类中直接写的字段”,不管访问修饰符,也不管是否被子类覆盖或隐藏。它返回的是 Field[] 数组,每个 Field 对象代表一个字段的反射信息。
基本用法示例
假设有一个类:
class Parent { public String p = "parent"; }
class Child extends Parent { private int x; protected String y; final double z = 3.14; }
调用 Child.class.getDeclaredFields() 返回的数组包含三个元素:x、y、z;p 不会出现,因为它定义在 Parent 中。
常见注意事项
- 返回数组顺序**不保证与源码声明顺序一致**,实际顺序取决于 JVM 实现(通常按声明顺序,但不应依赖)
- 如果类没有声明任何字段,返回空数组(
length == 0),不会返回null - 泛型类型信息可通过
Field.getGenericType()获取,原始类型用Field.getType() - 私有字段默认无法直接读写,需配合
field.setAccessible(true)才能绕过访问检查(注意模块系统限制)
如何获取包括父类字段在内的全部字段
若需要所有字段(含继承的),需手动遍历类层次结构:
- 从目标类开始,调用
getDeclaredFields() - 再调用
getSuperclass()获取父类,重复上述步骤,直到getSuperclass() == null - 注意:接口中的字段(public static final)需通过
getInterfaces()单独处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











