java - Java 模块层:从未命名的模块访问自定义 ModuleLayer 中的类
问题描述
我们有一个包含多个模块层的插件系统:
PluginLoader
引导层内的模块在运行时为每个模块实例化一个自ModuleLayer
定义.Module
ModuleLayer::defineModulesWithOneLoader
我们现在有一组非模块化插件,需要访问自定义层内的模块化插件。它们将在自定义层被实例化后加载。如何做到这一点?
简单地将它们放在类路径上是行不通的,因为模块化类将被第二次加载,而不是使用模块化插件中的(已经加载的)类。
我们的下一个尝试是创建一个虚拟插件并将其最后加载到一个层中,该层具有所有其他层(因此是模块化插件)作为父层。似乎无法将 URL 添加到该defineModulesWithOneLoader
方法生成的类加载器。相反,我们创建了一个自定义 URLClassLoader 作为此类加载器的父级,并通过URLClassLoader::addURL
.
这适用于非模块化插件类。然而,如果一个已经加载在一个模块化插件中的类被这样一个类引用,它也会尝试用我们的自定义加载类URLClassLoader
(失败,因为父级是null
)而不是模块的内部类加载器,它委托到父层。有没有办法将我们的非模块化插件的类加载到类加载器的未命名模块中,该模块的行为类似于 JPMS 的默认类加载器(首先搜索父层),但仍将类加载到非模块化 JAR 中,如果它们是在父层中找不到?
可以通过使用自动模块来解决这个问题,但我们现在想避免这种情况,因为它会导致我们目前没有资源进行的一系列其他必要的更改(例如解析拆分包)。
解决方案
推荐阅读
- mysql - 如何在 SQL 中按周在不同列中查询具有聚合值的特定列?
- python-3.x - 在命令提示符中使用“python -m twisted.conch.stdio”命令时出错
- c# - C# WPF 从线程不断更新标签
- react-native - 反应本机异步存储mac OS pod安装失败
- python-3.x - 我正在尝试调用 cloudflare api“创建列表项”,但出现错误“需要类似字节的对象,而不是 'str'”。我如何解决它
- python - 如何在python中加速8位组合数字
- java - 如何为 OOP Java 中的 main 方法编写代码?
- r - `as.POSIXct` 使用 `"%Y-%m-%d %H:%M:%S"` 格式获取错误
- html - 弹出按钮中的 HTML 链接
- html - 根据注册的颜色显示表结构