讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 Java 中通过反射修改 Record 字段值?

胖雪姑娘_9831

胖雪姑娘_9831

发布时间:2026-01-18 21:48:24

|

692人浏览过

|

来源于php中文网

原创

如何在 Java 中通过反射修改 Record 字段值?

java 记录(record)类的字段天生为 final 且不可变,即使使用 `setaccessible(true)` 也无法通过反射修改其值——这是 jvm 的强制设计约束,而非实现缺陷。

Java 的 record 是一种语义级不可变数据载体,编译器会自动为所有组件字段生成 final 修饰符,并禁止运行时修改。这一点在 JVM 规范和 OpenJDK 实现中被严格保障:即使调用 Field.setAccessible(true),对 record 类中字段执行 Field.set() 仍会抛出 IllegalAccessException,原因正如 JDK-8247517 所述——record 类的字段明确被排除在反射写入权限之外,无论是否静态、是否私有。

这意味着以下代码注定失败:

public record Account(Integer id, String login, Boolean blocked) {}

Account account = new Account(null, null, null);
Field idField = Account.class.getDeclaredField("id");
idField.setAccessible(true);
idField.set(account, 42); // ❌ IllegalAccessException: Can not set final field...

✅ 正确解法:放弃对 record 的反射赋值

若业务逻辑必须支持运行时字段修改(如 ORM 映射、测试模拟、动态构建等),则不应使用 record,而应改用传统 POJO 类:

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
public class Account {
    private final Integer id;
    private final String login;
    private final Boolean blocked;

    public Account(Integer id, String login, Boolean blocked) {
        this.id = id;
        this.login = login;
        this.blocked = blocked;
    }

    // Getter 方法(可选,但推荐)
    public Integer getId() { return id; }
    public String getLogin() { return login; }
    public Boolean getBlocked() { return blocked; }

    @Override
    public String toString() {
        return "Account{id=" + id + ", login='" + login + "', blocked=" + blocked + "}";
    }
}

此时原反射工具方法 setFieldValue() 即可正常工作——因为普通类的 final 字段虽不可常规修改,但在满足 setAccessible(true) 等前提下,JVM 允许反射绕过该限制(仅限非 record 类)。

立即学习Java免费学习笔记(深入)”;

⚠️ 重要注意事项

  • 不要尝试“绕过”record的不可变性:诸如字节码增强(ASM)、Unsafe 操作或 JDK 内部 API 等方式不仅高度不稳定、版本依赖性强,更违反 record 的设计契约,将导致不可维护与安全风险。
  • 明确建模意图:record 应用于「值即契约」场景(如 DTO、配置项、函数式输入/输出);需可变状态时,请选择 class 并辅以 Builder 模式或 Lombok @Data / @Builder 提升开发效率。
  • 测试友好替代方案:若仅为单元测试构造对象,推荐使用构造函数直接实例化,或借助 with 风格的 builder(手动或通过 RecordBuilder 等工具生成),而非反射赋值。

总之,Java record 的不可变性是由语言语义、字节码规范与 JVM 运行时共同保障的硬性约束。尊重这一设计,合理选择类型(record vs class),才是写出健壮、可演进代码的关键。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

3056

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

286

2025.12.06

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

140

2026.09.16

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

60

2026.09.16

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

60

2026.09.16

Pandas数据筛选索引与清洗处理
Pandas数据筛选索引与清洗处理

本专题整理Pandas中的loc、iloc、条件筛选、query查询、缺失值处理、重复值删除、类型转换和字符串列清洗方法。

40

2026.09.16

Pandas数据读取导入与文件导出处理
Pandas数据读取导入与文件导出处理

本专题整理Pandas读取CSV、Excel、JSON、SQL、Parquet等文件的方法,以及to_csv、to_excel、to_sql和to_parquet等常用数据导出流程。

40

2026.09.16

GDB怎么设置断点
GDB怎么设置断点

本专题介绍GDB按照函数名、源代码行号和文件位置设置断点的方法,详细说明run、continue、next、step等命令的配合使用,帮助定位程序崩溃、逻辑异常及代码未按预期执行的问题。

360

2026.09.11

GDB怎么查看变量值
GDB怎么查看变量值

本专题介绍GDB调试过程中查看变量值的具体方法,涵盖局部变量、函数参数、数组、结构体和指针内容查询,同时整理变量持续显示、格式化输出及无法读取变量时的排查思路。

120

2026.09.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn