gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:43:02 33 4
gpt4 key购买 nike

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

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

最佳答案

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

ModuleLayer

A layer is created from a graph of modules in a Configuration and a function that maps each module to a ClassLoader.

ModuleLayer 没有ClassLoader 的概念,因为不能保证每个Module 都有相同的ClassLoader。相反,ClassLoader 与每个单独的 Module 相关联,您可以通过 Module.getClassLoader() 获取它们。 .

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

ModuleLayer layer = parent.defineModulesWithOneLoader(...);
ClassLoader loader = layer.modules().iterator().next().getClassLoader();

请注意,如果出现以下情况,这将无法正常工作:

  • ModuleLayer 是空的(没有Module)。
    • iterator().next() 将抛出一个 NoSuchElementException
  • 您通过 defineModulesWithManyLoaders(Configuration,ClassLoader) 创建了 ModuleLayer 1
    • 每个模块都有自己的ClassLoader
  • 您通过 defineModules(Configuration,Function) 创建了 ModuleLayer并且 Function 不会每次都返回相同的 ClassLoader
    • 允许 ModuleClassLoader 的任意组合。此外,每个 ClassLoader 都可能有不同的父级。此方法在定义 ModuleLayer 时提供了最大的灵 active 。

1。 defineModulesWithOneLoaderdefineModulesWithManyLoaders 方法实际上是 defineModules 的便捷方法,用于两个可预定义的用例;每个 Module 都有相同的 ClassLoader,每个 Module 分别有自己的 ClassLoader

关于java - 如何获取新创建的JPMS层的ClassLoader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52520493/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com