JDK11添加--add-opens等JVM参数仍无法解决InaccessibleObjectException问题
问题:JDK11中指定--add-opens参数仍无法解决InaccessibleObjectException
异常信息
java.lang.reflect.InaccessibleObjectException: Unable to make field protected transient int java.util.AbstractList.modCount accessible: module java.base does not "opens java.util" to unnamed module @43393097 at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
尝试过的方案
网上记载的常规修复参数:
--illegal-access=permit(JDK11标记为过时,JDK17移除)--add-opens=java.base/java.util=ALL-UNNAMED
我先后尝试过JDK17、Amazon Corretto 11、OpenJDK11,单独/组合使用上述参数(含--illegal-access=warn)均无效。
当前启动命令与JDK版本
me in ~/dev/project on branch main > java --version openjdk 11.0.19 2023-04-18 LTS OpenJDK Runtime Environment Corretto-11.0.19.7.1 (build 11.0.19+7-LTS) OpenJDK 64-Bit Server VM Corretto-11.0.19.7.1 (build 11.0.19+7-LTS, mixed mode) me in ~/dev/project on branch main > java -jar --add-opens=java.base/java.util=ALL-UNNAMED out/server/assembly.dest/out.jar
疑问
所有资料显示JDK11中--add-opens=java.base/java.util=ALL-UNNAMED可解决该问题,但实际无效。Jar包的构建方式是否会影响这个问题?这是否只是运行时权限问题?
解答
1. 修正JVM参数位置(最可能的根因)
你的启动命令存在参数顺序错误:JVM参数必须放在-jar之前,否则会被当作应用程序的启动参数而非JVM参数,自然无法生效。
错误命令:
java -jar --add-opens=java.base/java.util=ALL-UNNAMED out/server/assembly.dest/out.jar
正确命令:
java --add-opens=java.base/java.util=ALL-UNNAMED -jar out/server/assembly.dest/out.jar
2. Jar构建方式确实会影响权限配置
如果你的Jar是模块化JAR(包含module-info.class),那么ALL-UNNAMED就不适用——此时你的应用属于命名模块,需要将权限开放给对应模块名:
java --add-opens=java.base/java.util=你的应用模块名 -jar out/server/assembly.dest/out.jar
获取模块名的方法:
- 解压Jar包,查看
module-info.class中的module声明 - 启动时添加
--show-module-resolution参数,从日志中找到应用模块的名称
3. 其他排查点
- 若应用依赖框架(如Spring、MyBatis等),部分框架内部也会通过反射访问
AbstractList的modCount,可能需要额外添加针对框架模块的--add-opens参数 - 检查是否存在冲突的JVM参数,比如
--illegal-access=deny会覆盖--illegal-access=permit的效果(JDK11中permit仍可用但会触发警告)
内容的提问来源于stack exchange,提问作者Bender Rodriguez
相关产品推荐
相关产品推荐

