也许这是一个简单的问题,但仍然可以找到方法。假设我使用以下代码创建图层
malloc
据我了解,对于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
的类加载器?
答案 0 :(得分:4)
创建ModuleLayer
时,每个Module
都映射到ClassLoader
。
ModuleLayer
根据“配置”中的模块图和将每个模块映射到ClassLoader 的函数创建一个层。
ModuleLayer
没有ClassLoader
的概念,因为不能保证每个Module
都具有相同的ClassLoader
。相反,ClassLoader
与每个单独的Module
相关联,您可以通过Module.getClassLoader()
来获得。
由于您使用的是ModuleLayer.defineModulesWithOneLoader(Configuration,ClassLoader)
1 ,因此 可以保证每个Module
都具有相同的ClassLoader
。这意味着您可以从ClassLoader
中的任何Module
获取ModuleLayer
,并将其视为ClassLoader
中的“ ModuleLayer
”。
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
并非每次都返回相同的ClassLoader
。
Module
到ClassLoader
的任意组合。此外,每个ClassLoader
都可能具有不同的父母。定义ModuleLayer
时,此方法提供了最大的灵活性。 1。实际上,方法defineModulesWithOneLoader
和defineModulesWithManyLoaders
是defineModules
的便捷方法,适用于两个可预定义的用例。每个Module
具有相同的ClassLoader
,每个Module
具有各自的ClassLoader
。