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
的方法是方便的方法;每个模块
都有相同的类加载器
,每个模块
都有各自的类加载器