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

czfnxgou  于 4个月前  发布在  Java
关注(0)|答案(1)|浏览(83)

在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?
我是否应该考虑另一种方法?
提前感谢您的帮助。

k2fxgqgv

k2fxgqgv1#

假设您遇到了这样的错误:模块java.base不会“打开java.security“到未命名的模块@75226b29
所以要解决这个问题,你必须得到“java.base”来打开“java.security“到模块unnamed module@75226b29,并且每次这个模块的名称更改时,你必须使用下面的命令为所有未命名的模块打开它:
--add-opens java.base/java.security=ALL-UNNAMED

相关问题