Class.getRecordComponents 是 Java 16 引入的 API,用于运行时获取 record 类的结构信息;它返回 RecordComponent[],包含每个 component 的名称、类型、泛型签名、注解及 accessor 方法,顺序与声明一致,且仅对 record 类有效。

Class.getRecordComponents 是 Java 16 引入的 API,专用于在运行时获取 record 类的结构信息(即各个 record component 的名称、类型、泛型签名、注解等),是反射读取 record 的核心方法。
什么是 Record Component?
record 的每个字段(如 record Person(String name, int age) {} 中的 name 和 age)在 JVM 中被称为 “record component”,它不是普通字段,而是由编译器生成的、带访问器方法(如 name())的逻辑成员。JVM 层面将其建模为 RecordComponent 对象,可通过 getRecordComponents() 获取。
如何用 getRecordComponents() 获取结构信息
调用该方法前需确认类是 record(否则返回 null 或空数组):
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 必须使用 Java 16+ 运行时,且 record 类由支持 record 的编译器(javac 14+)编译
- 该方法返回
RecordComponent[],顺序与 record 声明中的参数顺序一致 - 每个
RecordComponent提供:getName()、getType()、getGenericType()、getAnnotations()、getAccessor()(对应 getter 方法)等
示例:
立即学习“Java免费学习笔记(深入)”;
record Point(int x, String label) {}
Class<Point> clazz = Point.class;
if (clazz.isRecord()) {
RecordComponent[] components = clazz.getRecordComponents();
for (RecordComponent rc : components) {
System.out.println(
rc.getName() + " : " +
rc.getType().getSimpleName() + " | " +
rc.getAccessor().getName()
);
// 输出:x : int | x;label : String | label
}
}
常见用途和注意事项
- 序列化/反序列化框架(如 Jackson 2.12+)依赖此 API 自动发现 record 字段,无需额外注解
- 不能通过
getDeclaredFields()可靠获取 record 字段——它们可能被标记为private final且无 public setter,也不反映 accessor 语义 -
getRecordComponents()返回的是逻辑组件,不是运行时字段;即使 record 使用泛型(如record Box<t>(T value)</t>),getGenericType()也能正确返回Type实例 - 若对非 record 类调用该方法,Java 16+ 返回空数组(
length == 0),不会抛异常;但建议先用isRecord()判断
兼容性与替代方案
低于 Java 16 的环境无法使用该 API。若需兼容旧版本:
- 可尝试通过
getMethods()找到与字段名同名、无参、返回类型匹配的 public 方法(模拟 accessor),但需自行处理重载、泛型擦除等问题 - 不推荐依赖
getDeclaredFields()解析 record 结构,因为字段名/修饰符/顺序在不同 JDK 版本中可能变化,且不包含 accessor 语义 - 构建工具或注解处理器可在编译期生成元数据(如
RecordMetadata类),绕过运行时反射限制

















