如何获取新创建的 JPMS 层的 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不知道myLayer模块内部可以包含哪些类的情况下获得对这个类加载器的引用?


弑天下
浏览 185回答 1
1回答

月关宝盒

ModuleLayer创建a 时,每个Module都会映射到 a ClassLoader。ModuleLayer层是从 Configuration 中的模块图和将每个模块映射到 ClassLoader的函数创建的。AModuleLayer没有 a 的概念,ClassLoader因为不能保证每个人Module都会有相同的ClassLoader。相反,ClassLoader与每个人相关联Module,您可以通过 获得Module.getClassLoader()。但是,由于您使用的是1,因此可以保证每个都具有相同的. 这意味着您可以从 中的任何一个中获取 ,并将其视为“的”。ModuleLayer.defineModulesWithOneLoader(Configuration,ClassLoader)ModuleClassLoaderClassLoaderModuleModuleLayerClassLoaderModuleLayerModuleLayer layer = parent.defineModulesWithOneLoader(...); ClassLoader loader = layer.modules().iterator().next().getClassLoader();请注意,如果出现以下情况,这将无法按预期工作:该ModuleLayer是空的(没有ModuleS)。iterator().next()会抛出一个NoSuchElementException.您创建ModuleLayer通孔1defineModulesWithManyLoaders(Configuration,ClassLoader)每个人Module都会有自己的ClassLoader。您创建了过ModuleLayer孔,defineModules(Configuration,Function)并且每次Function都不会返回相同的值ClassLoader。允许任意组合Moduleto ClassLoader。此外,每个人ClassLoader都可能有不同的父母。这种方法在定义ModuleLayers时提供了最大的灵活性。1. 方法defineModulesWithOneLoader和defineModulesWithManyLoaders实际上是defineModules用于两个可预定义用例的便捷方法;每个Module都有相同的ClassLoader,每个Module都有自己的ClassLoader,分别。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java