首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Unable to make field private final java.lang.String java.io.File.path accessible

Unable to make field private final java.lang.String java.io.File.path accessible

原创
作者头像
用户10171634
发布2025-08-04 10:23:40
发布2025-08-04 10:23:40
29600
代码可运行
举报
运行总次数:0
代码可运行

这个错误:

代码语言:javascript
代码运行次数:0
运行
复制
arduinoCopyEditUnable to make field private final java.lang.String java.io.File.path accessible: module java.base does not "opens java.io" to unnamed module

Java 模块系统(Jigsaw) 的访问限制导致的,出现在 Java 16 及以后版本中更常见。

原因简述

你正在使用 反射(Reflection) 访问 Java 标准库中被 private 修饰的字段(如 java.io.File.path),但 模块系统禁止未显式开放的访问

模块系统引入后,Java 的标准模块(如 java.base)默认不开放其包给未命名模块(即普通的非模块化应用)。


解决方案

✅ 方法 1:在运行时加 JVM 参数(最常用)

修改你的运行配置,加上下面的 JVM 参数:

代码语言:javascript
代码运行次数:0
运行
复制
bashCopyEdit--add-opens java.base/java.io=ALL-UNNAMED

比如运行 Java 程序时:

代码语言:javascript
代码运行次数:0
运行
复制
bashCopyEditjava --add-opens java.base/java.io=ALL-UNNAMED -jar your-app.jar

或者在 Android Studio 中:

  • 打开 Run > Edit Configurations
  • 在 VM options 中添加: csharpCopyEdit--add-opens java.base/java.io=ALL-UNNAMED

✅ 方法 2:避免使用反射操作 File.path

如果你能控制代码,不要使用反射访问 java.io.File 的私有字段。比如:

代码语言:javascript
代码运行次数:0
运行
复制
javaCopyEditFile file = new File("some/path");
String path = file.getPath(); // 用公有方法代替反射访问私有字段

⚠️ 附加说明

从 Java 16 开始,默认是 强封装(strong encapsulation),这类错误将更加常见,除非:

  • 你明确用 --add-opens 解封模块;
  • 或者你使用的是 Java 8(Java 8 不启用模块系统); 直接换成java 11

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原因简述
  • ✅ 解决方案
    • ✅ 方法 1:在运行时加 JVM 参数(最常用)
    • ✅ 方法 2:避免使用反射操作 File.path
  • ⚠️ 附加说明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档