在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?
我是否应该考虑另一种方法?
提前感谢您的帮助。
1条答案
按热度按时间k2fxgqgv1#
假设您遇到了这样的错误:模块java.base不会“打开java.security“到未命名的模块@75226b29
所以要解决这个问题,你必须得到“java.base”来打开“java.security“到模块unnamed module@75226b29,并且每次这个模块的名称更改时,你必须使用下面的命令为所有未命名的模块打开它:
--add-opens java.base/java.security=ALL-UNNAMED