自动模块 未命名模块 java_java11教程--ModuleLayer类

Java虚拟机中的一层模块。

从Configuration中的模块图创建图层,并将每个模块映射到ClassLoader 。 创建图层会通知Java虚拟机有关可从模块加载的类,以便Java虚拟机知道每个类所属的模块。

创建图层会为配置中的每个ResolvedModule创建一个模块对象。 对于每个解决模块是read ,所述模块 reads相应的运行时模块 ,其可以是在同一层或parent层。

defineModulesWithOneLoader和defineModulesWithManyLoaders方法提供了创建模块层的便捷方法,其中所有模块都映射到单个类加载器或每个模块映射到其自己的类加载器。 defineModules方法适用于更高级的情况,其中模块通过为方法指定的函数映射到自定义类加载器。 这些方法中的每一个都具有实例和静态变体。 实例方法创建一个以接收者作为父层的图层。 静态方法适用于更高级的情况,其中可以有多个父层,或者需要Controller来控制层中的模块

Java虚拟机至少有一个非空层,即boot层,它是在启动Java虚拟机时创建的。 引导层包含模块java.base并且是Java虚拟机中唯一具有名为“ java.base ”的模块的层。 引导层中的模块映射到Java虚拟机中的引导类加载器和其他类加载器built-in 。 创建其他图层时,引导层通常为parent 。

创建一个层中的每个模块 ,使其输出和opens由其ModuleDescriptor描述的包。 在创建图层时,将按照以下条件确定合格的导出(将包导出到一组目标模块而不是所有模块):

如果模块X将包导出到Y ,并且如果运行时模块 X读取模块 Y ,则将包导出到模块 Y (其可以与X在同一层中或父层)。

如果模块X将包导出到Y ,并且如果运行时模块 X未读取Y则定位目标Y就好像通过调用findModule来查找层或其父层中的模块一样。 如果找到Y ,则将包导出到找到的Y实例。 如果未找到Y则忽略限定导出。

合格的开仓的处理方式与合格的出口相同。

与创建Configuration时Configuration , automatic模块在创建图层时会受到特殊处理。 在Java虚拟机中创建一个自动模块,作为模块 ,读取Java虚拟机中的每个未命名的模块 。

除非另行指定,否则将null参数传递给null中的方法会导致抛出NullPointerException 。

用法示例:

此示例通过解析名为“ myapp ”的模块来创建配置,其中引导层的配置为父级。 然后,它会在此配置中创建一个包含模块的新层。 所有模块都定义为相同的类加载器。

ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3);

ModuleLayer parent = ModuleLayer.boot();

Configuration cf = parent.configuration().resolve(finder, ModuleFinder.of(), Set.of("myapp"));

ClassLoader scl = ClassLoader.getSystemClassLoader(); ModuleLayer layer = parent.defineModulesWithOneLoader(cf, scl); Class> c = layer.findLoader("myapp").loadClass("app.Main");

方法:

static ModuleLayer boot()

返回引导层。

Configuration configuration()

返回此层的配置。

ModuleLayer defineModules​(Configuration cf, Functionclf)

通过在给定Configuration的Java虚拟机中定义模块,创建一个新的模块层,并将其作为父层。

static ModuleLayer.Controller defineModules​(Configuration cf, ListparentLayers, Functionclf)

通过在给定 Configuration的Java虚拟机中定义模块来创建新的模块层。

ModuleLayer defineModulesWithManyLoaders​(Configuration cf, ClassLoader parentLoader)

通过在给定Configuration的Java虚拟机中定义模块,创建一个新的模块层,并将其作为父层。

static ModuleLayer.Controller defineModulesWithManyLoaders​(Configuration cf, ListparentLayers, ClassLoader parentLoader)

通过在给定 Configuration的Java虚拟机中定义模块来创建新的模块层。

ModuleLayer defineModulesWithOneLoader​(Configuration cf, ClassLoader parentLoader)

通过在给定Configuration的Java虚拟机中定义模块,创建一个新的模块层,并将其作为父层。

static ModuleLayer.Controller defineModulesWithOneLoader​(Configuration cf, ListparentLayers, ClassLoader parentLoader)

通过在给定 Configuration的Java虚拟机中定义模块来创建新的模块层。

static ModuleLayer empty()

返回空层。

ClassLoader findLoader​(String name)

返回ClassLoader具有给定名称的模块的。

OptionalfindModule​(String name)

返回该层中具有给定名称的模块,如果不在此层中,则返回父层。

Setmodules()

返回此层中的模块集。

Listparents()

返回该层的父级列表,除非这是没有父级的 空层,因此返回一个空列表。

String toString()

返回描述此模块层的字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: /java.io=all-unnamed --add-opens=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED 这是一条命令,用于设置 JDK 的 Java 选项。其中,--add-opens 参数用于打开指定模块的包,以便其他模块可以访问它们。这里指定了三个模块:java.base、java.io 和 java.rmi。ALL-UNNAMED 表示打开这些模块中所有命名的包。 ### 回答2: 在Java应用程序中,我们可以使用JDK来编写和运行代码。在运行JDK时,可能需要使用某些选项来控制它的行为。例如,在运行Java虚拟机时,我们可以添加一些选项来指定JVM的行为,以满足我们的需求。 在这里,我们提到的选项是“picked up jdk_java_options: --add-opens=java.base/java.lang=all-unnamed --add-opens=java.base”。这个选项的作用是打开一些Java模块的深层命名空间,确保它们的访问正确而安全。对于不熟悉Java模块化系统的读者,这可能听起来很困惑,让我们进一步解释。 JDK 9引入了Java模块化系统,它允许将代码组织成离散、可重用和可测试的单元。Java模块可以定义和隔离它们自己的API和实现细节,并将其公开给其他模块。这有助于减少Java应用程序中的依赖和耦合,从而提高了应用程序的健壮性和可维护性。 然而,Java模块化系统引入了一些新的访问控制机制,如模块路径和模块化关键字。这些机制有时会导致某些模块无法加载或访问。在这种情况下,“--add-opens”选项可以打开深层命名空间,以确保所有的模块都能够被正确加载和访问。 具体来说,“--add-opens=java.base/java.lang=all-unnamed --add-opens=java.base”选项打开了java.base模块的所有Java.lang包的命名访问层级。这意味着包中的所有类都可以被其他模块访问,而不需要将Java.lang包的任何内容导出到外部世界。 总之,“--add-opens”选项在一些情况下是必要的,可以确保Java应用程序中的所有模块被正确加载和访问。然而,在使用此选项时,需要谨慎,并确保了解其背后的原因和实现细节。 ### 回答3: 这段话涉及到了JDK的Java选项中的add-opens参数。add-opens参数是JDK 9中引入的一项新功能,用于控制Java程序在运行时能够打开哪些包以便运行。它主要用于解决在新的模块化系统中,由于禁止在模块外部访问模块内部的包,导致一些老代码无法正常运行的问题。 具体来说,add-opens参数可以通过以下方式使用: --add-opens=module/package=othermodule(,othermodule)* 其中,module表示需要打开的模块,package表示需要打开的包,othermodule表示可以访问该模块内部包的其他模块。可以通过逗号分隔来指定多个模块或其他模块。 在这段话中,选项为--add-opens=java.base/java.lang=all-unnamed --add-opens=java.base。意思是打开java.base模块中所有命名的java.lang包以及整个java.base模块。这样做是为了解决一些第三方库在运行时需要访问java.base模块中的一些类或方法,但在JDK 9之后由于模块化限制而无法访问。 综上,add-opens参数是JDK 9中新增的一个功能,可以用于控制Java程序在运行时打开哪些包以便运行。通过指定模块、包和其他模块的方式,可以解决一些老代码在模块化系统下无法正常运行的问题。在这段话中,指定了打开java.base模块中所有命名的java.lang包以及整个java.base模块,以便确保第三方库能够正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值