Java 如何获取新创建的JPMS层的类加载器?

Java 如何获取新创建的JPMS层的类加载器?,java,java-9,java-module,Java,Java 9,Java Module,也许这是一个简单的问题,但仍然可以找到如何做到这一点。让我们假设我使用以下代码来创建图层 ModuleFinder finder = ModuleFinder.of(moduleCPath); ModuleLayer parent = ModuleLayer.boot(); Configuration cf = parent.configuration().resolve(finder, ModuleFinder.of(), Set.of("module-c")); ClassLoader sc

也许这是一个简单的问题,但仍然可以找到如何做到这一点。让我们假设我使用以下代码来创建图层

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 layer = parent.defineModulesWithOneLoader(...);
ClassLoader loader = layer.modules().iterator().next().getClassLoader();
ModuleLayer
层是从配置中的模块图和一个函数创建的,该函数将每个模块映射到类加载器

ModuleLayer
没有
ClassLoader
的概念,因为不能保证每个
模块都有相同的
ClassLoader
。相反,
类加载器
与每个单独的
模块
相关联,您可以通过

但是,由于您使用的是1,因此可以保证每个
模块
将具有相同的
类加载器
。这意味着你可以从< <代码>模块> <模块> >代码>中获得< <代码> ClassLoader <代码>,并将其视为“<代码> ClassLoader <代码>代码模块>模块> <代码> >

请注意,在以下情况下,这将无法正常工作:

  • 模块层
    为空(没有
    模块
    s)。
    • iterator().next()
      将抛出一个
      NoTouchElementException
  • 通过1创建
    模块层
    • 每个
      模块
      都有自己的
      类加载器
  • 通过创建
    模块层
    ,并且
    函数
    不会每次返回相同的
    类加载器
    • 允许
      模块
      类加载器
      的任意组合。此外,每个
      ClassLoader
      可能具有不同的父级。此方法在定义
      ModuleLayer
      s时提供了最大的灵活性

一,。对于两个预先定义的用例,实际上,使用
defineModulesSwitnowner
DefineModule swithmanyLoader
的方法是方便的方法;每个
模块
都有相同的
类加载器
,每个
模块
都有各自的
类加载器