如何获取新创建的JPMS层的ClassLoader?

How to get ClassLoader of newly created JPMS layer?

也许这是个简单的问题,但仍然可以找到解决方法。假设我使用以下代码创建图层

ModuleFinder finder = ModuleFinder.of(moduleCPath);
ModuleLayer parent = ModuleLayer.boot();
Configuration cf = parent.configuration().resolve(finder, ModuleFinder.of(), Set.of("module-c"));
ClassLoader scl = ClassLoader.getSystemClassLoader();
ModuleLayer myLayer = parent.defineModulesWithOneLoader(cf, scl);

据我所知,myLayer 创建了一个类加载器。在不知道 myLayer 模块中可以包含什么 类 的情况下,我如何才能引用此类加载器?

创建 ModuleLayer 时,每个 Module 都映射到 ClassLoader

ModuleLayer

A layer is created from a graph of modules in a Configuration and a function that maps each module to a ClassLoader.

A ModuleLayer 没有 ClassLoader 的概念,因为不能保证每个 Module 都会有相同的 ClassLoader。相反,ClassLoader 与每个个体相关联 Module,您可以通过 Module.getClassLoader().

获得

由于您正在使用 ModuleLayer.defineModulesWithOneLoader(Configuration,ClassLoader)1,但是,保证每个 Module有相同的ClassLoader。这意味着您可以从 ModuleLayer 中的任何 Module 获取 ClassLoader 并将其视为 ModuleLayer 的“ClassLoader”。

ModuleLayer layer = parent.defineModulesWithOneLoader(...);
ClassLoader loader = layer.modules().iterator().next().getClassLoader();

请注意,如果出现以下情况,这将无法正常工作:

  • ModuleLayer 为空(没有 Module)。
    • iterator().next() 会抛出一个 NoSuchElementException.
  • 您通过 defineModulesWithManyLoaders(Configuration,ClassLoader)1 创建了 ModuleLayer
    • 每个 Module 都会有自己的 ClassLoader
  • 您通过 defineModules(Configuration,Function) 创建了 ModuleLayer,而 Function 并非每次都 return 相同 ClassLoader
    • 允许 ModuleClassLoader 的任意组合。此外,每个 ClassLoader 可能有不同的 parents。此方法在定义 ModuleLayer 时提供了最大的灵活性。

1. defineModulesWithOneLoaderdefineModulesWithManyLoaders 方法实际上是 defineModules 两个 pre-definable 用例的便捷方法;每个 Module 都有相同的 ClassLoader,每个 Module 分别有自己的 ClassLoader