[Java] Java 17 FAQ

news/2025/3/14 9:20:56/文章来源:https://www.cnblogs.com/johnnyzen/p/18771455

概述: Java 17

FAQ for Java 17

Q: 利用反射机制private 属性的 Field 设置为 true(field.setAccessible(true))时报: "java.lang.reflect.InaccessibleObjectException: Unable to make field private int java.io.StringReader.next accessible: module java.base does not "opens java.io" to unnamed module @411e7bd3",如何解决?

问题描述

  • 利用反射机制private 属性的 Field 设置为 true(field.setAccessible(true))时报:

"java.lang.reflect.InaccessibleObjectException: Unable to make field private int java.io.StringReader.next accessible: module java.base does not "opens java.io" to unnamed module @411e7bd3"

问题分析

在 Java 17 中,由于模块系统的限制,直接使用反射机制访问私有属性可能会导致 InaccessibleObjectException 异常。
这是因为 Java 9 引入的模块系统Project Jigsaw)限制了不同模块之间的非法反射访问

解决方案

方法1. 使用 --add-opens JVM 参数 (亲测有效)

可以通过在启动 Java 程序时添加 --add-opens 参数来允许特定模块的反射访问。例如,如果你需要访问 java.io 包中的私有字段,可以使用以下VM Option参数:

--add-opens java.base/java.io=ALL-UNNAMED

这个参数允许所有未命名模块访问 java.base/java.io 包中的非公共成员

方法2. 修改代码以使用 MethodHandles.privateLookupIn

  • 在 Java 9 及以上版本中,可以使用 MethodHandles.privateLookupIn 方法来获取私有字段的访问权限。

以下是一个示例:

import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;public class ReflectionExample {public static void main(String[] args) throws Exception {StringReader stringReader = new StringReader("example");// 获取私有字段的 VarHandleVarHandle nextField = MethodHandles.privateLookupIn(StringReader.class, MethodHandles.lookup()).findVarHandle(StringReader.class, "next", int.class);// 设置字段值nextField.set(stringReader, 10);System.out.println("Modified next field value: " + nextField.get(stringReader));}
}

方法3. 使用 Unsafe 类 (亲测有效)

  • 虽然不推荐,但可以使用 Unsafe 类来绕过反射限制。

以下是一个示例:

import sun.misc.Unsafe;public class UnsafeExample {public static void main(String[] args) throws Exception {StringReader stringReader = new StringReader("example");// 获取 Unsafe 实例Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");unsafeField.setAccessible(true);Unsafe unsafe = (Unsafe) unsafeField.get(null);// 获取私有字段的偏移量Field nextField = StringReader.class.getDeclaredField("next");long offset = unsafe.objectFieldOffset(nextField);// 设置字段值unsafe.putInt(stringReader, offset, 10);System.out.println("Modified next field value: " + unsafe.getInt(stringReader, offset));}
}

总结

  • 推荐使用 --add-opens 参数来解决反射访问私有字段的问题,因为它是最简单且符合 Java 模块系统规范的解决方案。
  • 如果需要更复杂的反射操作,可以考虑使用 MethodHandles.privateLookupInUnsafe 类,但需要注意这些方法可能带来的安全性和稳定性问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/898504.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hyper-V单硬盘空间管理

在Hyper-V环境中,单硬盘空间管理是一项至关重要的任务,它直接关系到虚拟化环境的稳定性和性能。以下是一些关于Hyper-V单硬盘空间管理的关键策略和建议:一、磁盘空间紧张的原因分析 在Hyper-V环境中,磁盘空间紧张的原因多种多样,主要包括: 虚拟机快照积累:虚拟机快照是虚…

如何通过文件安全传输网关,解决堡垒机远程运维的安全问题?

堡垒机又称运维审计系统或跳板机,是指在特定网络环境下,为保障网络和数据不受内外部用户的入侵和破坏,运用技术手段监控和记录运维人员对网络内服务器、网络设备、安全设备、数据库等的操作行为,以实现集中报警、及时处理及审计定责的设备。当用户采用堡垒机开展远程运维和…

可以使用MathNet.Numerics生成一条X方向的N阶曲线

本文介绍不依赖贝塞尔曲线,如何绘制一条平滑曲线,用于解决无贝塞尔控制点的情况下绘制曲线、但数据点不在贝塞尔曲线的场景。 在上一家公司我做过一个平滑曲线编辑工具,用于轮椅调整加减速曲线。基于几个用户可控制的点,生成一条平滑的曲线,控制点需要保持在曲线上。 今天…

20241905 2024-2025-2 《网络攻防实践》 第3次作业

20241905 2024-2025-2 《网络攻防实践》 第3次作业 1. 实验内容实践tcpdump:使用tcpdump开源软件对在本机上访问网站过程进行嗅探,并回答问题:你在访问网站首页时,浏览器将访问多少个Web服务器?他们的IP地址都是什么?实践wireshark:使用Wireshark开源软件对在本机上以TE…

项目到底该怎么管?掌握“六抓六放”原则就够了!

很多人一听“项目管理”,就觉得复杂、高大上,好像必须懂各种工具、框架,还得写一堆流程文档,才能把项目搞好。 其实,项目管理说到底,就是抓住关键、放掉多余,既不瞎忙,也不瞎管! 有的管理者啥都不管,结果项目乱成一锅粥;有的领导什么都要过问,事无巨细盯着,结果把…

Open-Sora 2.0 重磅开源!

潞晨科技正式推出 Open-Sora 2.0 —— 一款全新开源的 SOTA 视频生成模型,仅 20 万美元(224 张 GPU)成功训练商业级 11B 参数视频生成大模型。开发高性能的视频生成模型通常耗资高昂:Meta 的视频模型训练需要 6000 多张 GPU 卡片,投入数百万美元。 在多项关键指标上,它与…

homebrew 视化管理工具

安装cakebrew官网brew cask install cakebrew过程如下➜ study brew cask install cakebrew ==> Downloading https://cakebrew-377a.kxcdn.com/cakebrew-1.2.5.dmg ######################################################################## 100.0% ==> Verifying SH…

Cisco Nexus 9000v Switch, NX-OS Release 10.4(5)M - 虚拟化数据中心交换机

Cisco Nexus 9000v Switch, NX-OS Release 10.4(5)M - 虚拟化数据中心交换机Cisco Nexus 9000v Switch, NX-OS Release 10.4(5)M - 虚拟化数据中心交换机 用于网络原型设计和学习研究的虚拟化数据中心交换机 请访问原文链接:https://sysin.org/blog/cisco-nexus-9000v/ 查看最…

Cisco ACI Simulator 6.0(9c)M - ACI 模拟器

Cisco ACI Simulator 6.0(9c)M - ACI 模拟器Cisco ACI Simulator 6.0(9c)M - ACI 模拟器 Application Centric Infrastructure (ACI) Simulator Software 请访问原文链接:https://sysin.org/blog/cisco-acisim-6/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org…

Cisco Modeling Labs (CML) 2.8.1 - 网络仿真工具

Cisco Modeling Labs (CML) 2.8.1 - 网络仿真工具Cisco Modeling Labs (CML) 2.8.1 - 网络仿真工具 思科建模实验室 (CML) 请访问原文链接:https://sysin.org/blog/cisco-modeling-labs-2/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.orgCisco Modeling Labs 是…

中国的科技不如欧美,但我们实际感觉上,不论建筑,硬件还是软件,理论,我们都已经高于欧美了,那为什么还说我们不如欧美呢?

前言 最近学习了一新概念,叫科学发现和科技发明,科学发现是高于科技发明的,而这个说法我觉得还是挺有道理的,我们总说中国的科技不如欧美,但我们实际感觉上,不论建筑,硬件还是软件,理论,我们都已经高于欧美了,那为什么还说我们不如欧美呢?科学发现是高于科技发明就很…