如何获取新创建的JPMS层的ClassLoader?

时间:2018-09-26 14:46:20

标签: java java-9 java-module

也许这是一个简单的问题,但仍然可以找到方法。假设我使用以下代码创建图层

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的类加载器?

1 个答案:

答案 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
    • 允许将ModuleClassLoader的任意组合。此外,每个ClassLoader都可能具有不同的父母。定义ModuleLayer时,此方法提供了最大的灵活性。

1。实际上,方法defineModulesWithOneLoaderdefineModulesWithManyLoadersdefineModules的便捷方法,适用于两个可预定义的用例。每个Module具有相同的ClassLoader,每个Module具有各自的ClassLoader