写点什么

JEP 500:通过限制反射来强制实现 Final 字段的严格不可变性

  • 2025-12-24
    北京
  • 本文字数:1264 字

    阅读完需:约 4 分钟

大小:541.73K时长:03:04
JEP 500:通过限制反射来强制实现Final字段的严格不可变性

JEP 500,“让Final名副其实(Prepare to Make Final Mean Final)”已经在 JDK 26 中完成。该 JEP 旨在为 Java 生态系统做好准备,未来将不再允许通过深度反射(deep reflection)修改声明为 final 的字段,以前,这种操作通常是通过AccessibleObject类中定义的setAccessible()方法实现的。此举标志着一条弃用路径的开始,在未来的 JDK 版本中,默认行为将会变为抛出IllegalAccessException,从而彻底堵上 Java 封装模型中长期存在的一个漏洞。

 

长期以来,尽管final字段被视为不可变性的契约,但 Java 历史上一直允许通过反射破坏这一契约。这个最初为支持对象序列化而保留的漏洞,被 OpenJDK 团队称为累积的“完整性债务(integrity debt)”。随着时间的推移,依赖注入、序列化和 Mock 框架广泛依赖反射修来修改 final 字段,这迫使 JVM 的即时编译器(JIT)不得不做出保守性的假设,从而限制了依赖真正不可变性的优化(如常量折叠)。通过恢复final关键字更强的不可变性保障,平台将能启用更激进的优化,并为开发者和架构师提供更可靠的语义,尤其在并发程序中。

 

在 JDK 26 的新行为中,尝试通过深度反射修改final字段的代码仍会成功执行(以保持兼容性),但 JVM 会在每个模块首次发生此类操作时默认输出警告。

 

考虑如下的样例:

java.lang.reflect.Field f = MyClass.class.getDeclaredField("value");f.setAccessible(true);        // 深度反射f.set(myInstance, 42);        // 修改一个final字段
复制代码

 

在运行期,这段代码将触发一个警告,指出 final 字段已被反射修改,如下所示:

WARNING: Final field value in MyClass has been mutated by ...
复制代码

该行为由--illegal-final-field-mutation选项控制,JDK 26 中它的默认值为warn

 

为管理这一转变,JEP 500 引入了多种运行时模式,与近年来 Java 版本中其他访问控制机制的做法类似:

  • --illegal-final-field-mutation=warn(默认值)


    继续支持反射,但是会发出一个警告

  • --illegal-final-field-mutation=deny 


    当尝试进行反射变更时,会抛出IllegalAccessException而失败

  • --illegal-final-field-mutation=allow 


    允许变更且没有警告(不推荐)

 

开发者也可在启动时选择性启用反射修改 final 字段的功能,例如:

java --enable-final-field-mutation=ALL-UNNAMED ...

或针对特定模块启用,从而为目前无法更新的遗留库提供可控的逃生通道。

 

为了进一步帮助团队为未来更严格的强制执行做好准备,JDK 26 还集成了 JDK Flight Recorder(JFR)。新增的jdk.FinalFieldMutation事件会记录每次 final 字段被修改的情况,并附带完整堆栈跟踪。这使得团队能在“deny”模式成为默认值之前,全面审计整个依赖树中的违规行为。

# Auditing an application for final field mutationsjava -XX:StartFlightRecording:filename=audit.jfr -jar my-app.jarjfr print --events jdk.FinalFieldMutation audit.jfr
复制代码

 

通过这些变更,Java 正回归对final更严格、更贴近其最初设计意图的阐述,同时仍为遗留场景提供了清晰的迁移路径。

 

原文链接:

JEP 500: Java to Enforce Strict Final Field Immutability by Restricting Reflection

2025-12-24 10:191

评论

发布
暂无评论

【HDC.2024】华为云致力推进全域Serverless时代,引领技术创新,赋能行业实践

云计算 Serverless 华为云

解决卡顿发热,超帧技术焕发中重载游戏动力

HarmonyOS SDK

HarmonyOS

测试开发比,能代表质效平衡吗?

老张

软件测试 研发效能 质量保障

和平台融合做套件,是SaaS厂商掘金的新趋势吗

ToB行业头条

AI系统:未来科技的驱动力

天津汇柏科技有限公司

人工智能 未来以来

2024软博会

AIOTE智博会

青岛软博会

基于STM32的智能粮仓系统设计

DS小龙哥

7月月更

Java Chassis 3技术解密,流式响应如何简化AI应用开发

华为云开发者联盟

Java 人工智能 华为云 华为云开发者联盟 企业号2024年7月PK榜

森马基于MaxCompute+Hologres+DataWorks构建数据中台

阿里云大数据AI技术

数据挖掘 大数据 阿里云 实时数仓 hologres

全面升级!GPT-4o 第一时间体验、疑问解答、福利揭秘

蓉蓉

openai GPT-4 gpt4o

Gin 教程:构建优雅的 Web 应用(一)

Felix

golang gin框架

文献解读-长读长测序-第十三期|《PrecisionFDA真相挑战第二版:利用短读长和长读长在难比对区域进行变异检测》

INSVAST

基准测试 基因数据分析 生信服务

IAM中的“跨生态纳管”

芯盾时代

身份安全 iam 生态链 统一身份管理平台

探秘数据库中的并行计算技术应用

华为云开发者联盟

MySQL 数据库 华为云 华为云开发者联盟 企业号2024年7月PK榜

科大讯飞:说说零拷贝技术和多路复用技术?

王磊

Java

JEP 500:通过限制反射来强制实现Final字段的严格不可变性_编程语言_A N M Bazlur Rahman_InfoQ精选文章