将 --add-opens 选项应用于 Java 17 中的动态加载模块

问题描述 投票:0回答:1
在 Java 17 中 JEP 403 的稳健封装的背景下,我有一个在 JVM 执行期间动态加载的类 (.jar)。

该类利用反射来调用属于 ClassLoader 的私有方法。

JVM 通过 CLI 选项

--add-opens

 解决了这个问题,它允许指定模块,以便反射成功工作。
但是,这种方法似乎不适用于动态加载的模块,即启动后加载的模块。

目前,我正在使用类似

--add-opens java.base/java.lang=foobar

 和下面的代码。

try { Method method = ClassLoader.class.getDeclaredMethod("findLoadedClass", String.class); method.setAccessible(true); // ... } catch (NoSuchMethodException | InaccessibleObjectException e) { // InaccessibleObjectException will be thrown. }
然后我在启动时收到此警告:

WARNING: Unknown module: foobar specified to --add-opens


为了解决此限制,我从 .jar 中删除了

module-info.class

,打算将其作为未命名模块加载,并在 JVM 启动时将 
--add-opens
 用于 
ALL_UNNAMED
 模块。
然而,由于其他技术限制,这种方法并不可行。

有人可以指导我如何对 JVM 启动后动态加载的模块有效地使用 --add-opens 吗?

我应该考虑其他方法吗?

预先感谢您的协助。

java jvm java-17 java-platform-module-system
1个回答
0
投票
假设您遇到以下错误: 模块 java.base 不会向未命名模块“打开 java.security”@75226b29

所以要解决这个问题,你必须让“java.base”打开“java.security”来模块未命名模块@75226b29,并且每次该模块的名称更改时,你必须使用以下命令为所有未命名模块打开它:

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

© www.soinside.com 2019 - 2024. All rights reserved.