java 14+ 中获取 record 字段信息应调用 getrecordcomponents() 方法,返回 recordcomponent[] 数组,按声明顺序排列;每个组件通过 getname()、gettype() 和 getaccessor() 获取名称、类型及只读 getter 方法,需先用 isrecord() 判断类型。

Java 中通过反射获取 Record 类的字段信息,不能像普通类那样用 getDeclaredFields(),因为 record 的字段是私有的且不直接暴露。正确方式是调用 getRecordComponents() 方法(Java 14+),它返回 RecordComponent[],每个组件封装了名称、类型、泛型类型和对应的 accessor(即 getter)方法。
获取 RecordComponent 数组
getRecordComponents() 是 Class 类在 Java 14 引入的原生方法,专用于 record 类型。调用前建议先判断是否为 record:
- 使用
Class.isRecord()确保目标类是 record,否则会返回空数组或抛出异常(实际不会抛异常,但语义上非 record 调用无意义) - 该方法返回的数组顺序与 record 声明时的参数顺序严格一致
- 若类不是 record,返回空数组(不是
null)
遍历 RecordComponent 并获取 Getter 方法
每个 RecordComponent 对象提供 getAccessor() 方法,返回一个 Method 对象 —— 这就是 record 自动生成的 public getter 方法(如 name()、age()):
- 该
Method已被设置为可访问(setAccessible(true)不必要) - 其修饰符一定是
public,返回类型与组件声明类型一致,无参数 - 可通过
component.getName()获取字段名(如"name"),对应 getter 名通常相同(record 规范要求)
完整示例代码
假设定义 record:record Person(String name, int age) {}
Person p = new Person("Alice", 30);
Class> clazz = p.getClass();
if (clazz.isRecord()) {
RecordComponent[] components = clazz.getRecordComponents();
for (RecordComponent rc : components) {
String name = rc.getName(); // "name", "age"
Class> type = rc.getType(); // String.class, int.class
Method accessor = rc.getAccessor(); // Person::name, Person::age
try {
Object value = accessor.invoke(p); // 调用 getter 获取值
System.out.println(name + " = " + value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意事项
- Java 版本必须 ≥ 14,且编译和运行环境均需支持 record(推荐 14+,17+ 更稳定)
-
RecordComponent不代表字段本身,而是逻辑上的“记录组件”,不包含内存偏移或反射字段对象 - 无法通过
RecordComponent直接获取注解(如@NonNull),需调用rc.getAnnotations()或rc.getAnnotation(YourAnn.class) - 不支持修改组件值 —— record 实例不可变,accessor 方法只读
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











