为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

弑天下 2021-10-13 13:36:13
也许这是一个简单的问题,但仍然可以找到如何去做。假设我使用以下代码创建图层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模块内部可以包含哪些类的情况下获得对这个类加载器的引用?
查看完整描述

1 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

ModuleLayer创建a 时,每个Module都会映射到 a ClassLoader

ModuleLayer

层是从 Configuration 中的模块图和将每个模块映射到 ClassLoader的函数创建的。

AModuleLayer没有 a 的概念,ClassLoader因为不能保证每个人Module都会有相同的ClassLoader。相反,ClassLoader与每个人相关联Module,您可以通过 获得Module.getClassLoader()

但是,由于您使用的是1,因此可以保证每个都具有相同的. 这意味着您可以从 中的任何一个中获取 ,并将其视为“的”。ModuleLayer.defineModulesWithOneLoader(Configuration,ClassLoader)ModuleClassLoaderClassLoaderModuleModuleLayerClassLoaderModuleLayer

ModuleLayer 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. 方法defineModulesWithOneLoaderdefineModulesWithManyLoaders实际上是defineModules用于两个可预定义用例的便捷方法;每个Module都有相同的ClassLoader,每个Module都有自己的ClassLoader,分别。


查看完整回答
反对 回复 2021-10-13
  • 1 回答
  • 0 关注
  • 178 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信