如何获取新创建的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
。
- 允许
Module
到 ClassLoader
的任意组合。此外,每个 ClassLoader
可能有不同的 parents。此方法在定义 ModuleLayer
时提供了最大的灵活性。
1. defineModulesWithOneLoader
和 defineModulesWithManyLoaders
方法实际上是 defineModules
两个 pre-definable 用例的便捷方法;每个 Module
都有相同的 ClassLoader
,每个 Module
分别有自己的 ClassLoader
。
也许这是个简单的问题,但仍然可以找到解决方法。假设我使用以下代码创建图层
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
。- 允许
Module
到ClassLoader
的任意组合。此外,每个ClassLoader
可能有不同的 parents。此方法在定义ModuleLayer
时提供了最大的灵活性。
- 允许
1. defineModulesWithOneLoader
和 defineModulesWithManyLoaders
方法实际上是 defineModules
两个 pre-definable 用例的便捷方法;每个 Module
都有相同的 ClassLoader
,每个 Module
分别有自己的 ClassLoader
。