模块 java.base

类 ModuleDescriptor

java.lang.Object
java.lang.module.ModuleDescriptor
所有已实现的接口:
Comparable<ModuleDescriptor>

public class ModuleDescriptor extends Object implements Comparable <ModuleDescriptor >
模块描述符。

模块描述符描述命名模块并定义获取其每个组件的方法。 Java 虚拟机中命名模块的模块描述符是通过调用 Module getDescriptor 方法获得的。也可以使用 ModuleDescriptor.Builder 类或使用此处定义的 read 方法读取模块声明 (module-info.class) 的二进制形式来创建模块描述符。

模块描述符描述了一个normal、开放或自动模块。 Normal 模块和开放模块描述它们的 依赖性exported-packages 、它们 使用提供 的服务,以及其他组件。 Normal 模块可能 open 特定的包。打开模块的模块描述符不声明任何打开的包(它的opens 方法返回一个空集)但是当在 Java 虚拟机中实例化时,它被视为所有包都打开。自动模块的模块描述符不声明任何依赖(除了对 java.base 的强制依赖),并且不声明任何导出或打开的包。自动模块在解析期间受到特殊处理,以便它们读取配置中的所有其他模块。当一个自动模块在 Java 虚拟机中实例化时,它会读取每个未命名的模块,并被视为所有包都已导出并打开。

ModuleDescriptor 对象是不可变的,可以安全地供多个并发线程使用。

自从:
9
参见:
  • 方法详情

    • name

      public String  name()

      返回模块名称。

      返回:
      模块名称
    • modifiers

      public Set <ModuleDescriptor.Modifier > modifiers()

      返回模块修饰符集。

      返回:
      一组可能为空的不可修改的修饰符
    • accessFlags

      public Set <AccessFlag > accessFlags()
      返回 模块标志 的集合。
      返回:
      一组可能为空的不可修改的模块标志
      Java 虚拟机规范:
      4.7.25 模块属性
      自从:
      20
      参见:
    • isOpen

      public boolean isOpen()

      如果这是一个打开的模块,则返回 true

      此方法相当于测试 modifiers 的集合是否包含 OPEN 修饰符。

      返回:
      true 如果这是一个开放模块
    • isAutomatic

      public boolean isAutomatic()

      如果这是一个自动模块,则返回 true

      此方法相当于测试 modifiers 的集合是否包含 AUTOMATIC 修饰符。

      返回:
      true 如果这是一个自动模块
    • requires

      public Set <ModuleDescriptor.Requires > requires()

      返回表示模块依赖关系的一组 Requires 对象。

      当此模块未命名为“java.base”时,该集合包括对“java.base”的依赖。如果此模块是自动模块,则它不依赖于“java.base”以外的任何模块。

      返回:
      一组可能为空的不可修改的 ModuleDescriptor.Requires 对象
    • exports

      public Set <ModuleDescriptor.Exports > exports()

      返回代表导出包的 Exports 对象集。

      如果此模块是自动模块,则导出集为空。

      返回:
      一组可能为空的不可修改的导出包
    • opens

      public Set <ModuleDescriptor.Opens > opens()

      返回表示打开包的 Opens 对象集。

      如果此模块是开放模块或自动模块,则开放包集为空。

      返回:
      一组可能为空的不可修改的开放包
    • uses

      public Set <String > uses()

      返回服务依赖集。

      如果此模块是自动模块,则服务依赖集为空。

      返回:
      所用服务类型的完全限定类名的可能为空的不可修改集
    • provides

      public Set <ModuleDescriptor.Provides > provides()

      返回表示模块提供的服务的 Provides 对象集。

      返回:
      该模块提供的可能为空的不可修改的服务集
    • version

      public Optional <ModuleDescriptor.Version > version()

      返回模块版本。

      返回:
      此模块的版本,如果模块没有版本或版本为不可解析的,则为空Optional
    • rawVersion

      public Optional <String > rawVersion()

      返回带有可能无法解析的模块版本的字符串。

      返回:
      包含模块版本的字符串,如果模块没有版本,则为空 Optional
      参见:
    • toNameAndVersion

      public String  toNameAndVersion()

      返回一个包含模块名称和版本(如果存在)的字符串。

      返回:
      包含模块名称和版本(如果存在)的字符串
    • mainClass

      public Optional <String > mainClass()

      返回模块主类。

      返回:
      模块主类的完全限定类名
    • packages

      public Set <String > packages()
      返回模块中的包集。

      包集包括所有导出和打开的包,以及任何服务提供者的包和主类的包。

      返回:
      模块中一组可能为空的不可修改的包
    • compareTo

      public int compareTo(ModuleDescriptor  that)
      将此模块描述符与另一个进行比较。

      两个 ModuleDescriptor 对象通过按字典顺序比较它们的模块名称来进行比较。如果模块名称相同,则比较模块版本。当比较模块版本时,带有版本的模块描述符被认为接替没有版本的模块描述符。如果两个版本都是 不可解析的,则按字典顺序比较 原始版本字符串。如果模块名称相同且版本相同(或两者都不存在),则比较修饰符集。通过比较为每个集合计算的 binary value 来比较修饰符集合。如果集合中存在修饰符,则其序号位置的位在二进制值中为 1,否则为 0。如果两组修饰符也相等,则以与 equals 一致的方式比较模块描述符的其他组件。

      指定者:
      compareTo 在接口 Comparable<ModuleDescriptor>
      参数:
      that - 要比较的模块描述符
      返回:
      如果此模块描述符小于、等于或大于给定的模块描述符,则为负整数、零或正整数
    • equals

      public boolean equals(Object  ob)
      测试此模块描述符是否与给定对象相等。

      如果给定对象不是 ModuleDescriptor,则此方法返回 false。如果两个模块描述符的每个相应组件都相等,则它们是相等的。

      此方法满足Object.equals 方法的一般契约。

      重写:
      equals 在类 Object
      参数:
      ob - 此对象要与之比较的对象
      返回:
      true 当且仅当给定对象是等于此模块描述符的模块描述符
      参见:
    • hashCode

      public int hashCode()
      计算此模块描述符的哈希码。

      哈希码基于模块描述符的组件,并满足 Object.hashCode 方法的一般契约。

      重写:
      hashCode 在类 Object
      返回:
      此模块描述符的哈希码值
      参见:
    • toString

      public String  toString()

      返回描述模块的字符串。

      重写:
      toString 在类 Object
      返回:
      描述模块的字符串
    • newModule

      public static ModuleDescriptor.Builder  newModule(String  name, Set <ModuleDescriptor.Modifier > ms)
      实例化构建器以构建模块描述符。
      参数:
      name - 模块名称
      ms - 模块修饰符集
      返回:
      一个新的建设者
      抛出:
      IllegalArgumentException - 如果模块名称是 null 或者不是合法的模块名称,或者修饰符集包含 AUTOMATIC 和其他修饰符
    • newModule

      public static ModuleDescriptor.Builder  newModule(String  name)
      实例化构建器以构建 normal 模块的模块描述符。此方法等效于使用 modifiers 的空集调用 newModule
      参数:
      name - 模块名称
      返回:
      一个新的建设者
      抛出:
      IllegalArgumentException - 如果模块名称是 null 或者不是合法的模块名称
    • newOpenModule

      public static ModuleDescriptor.Builder  newOpenModule(String  name)
      实例化构建器以构建打开模块的模块描述符。此方法等效于使用 OPEN 修饰符调用 newModule

      开放模块的构建器不能用于声明任何开放包。

      参数:
      name - 模块名称
      返回:
      构建开放模块的新构建器
      抛出:
      IllegalArgumentException - 如果模块名称是 null 或者不是合法的模块名称
    • newAutomaticModule

      public static ModuleDescriptor.Builder  newAutomaticModule(String  name)
      实例化构建器以构建自动模块的模块描述符。此方法等效于使用 AUTOMATIC 修饰符调用 newModule

      自动模块的构建器不能用于声明模块或服务依赖性。它也不能用于声明任何导出或打开的包。

      参数:
      name - 模块名称
      返回:
      构建自动模块的新构建器
      抛出:
      IllegalArgumentException - 如果模块名称是 null 或者不是合法的模块名称
      参见:
    • read

      public static ModuleDescriptor  read(InputStream  in, Supplier <Set <String >> packageFinder) throws IOException
      从输入流中读取模块声明的二进制形式作为模块描述符。

      如果输入流中编码的描述符不指示模块中的一组包,则将调用 packageFinderpackageFinder返回的包集合必须包括模块导出、打开的所有包,以及模块提供的服务实现的包,以及主类的包(如果模块有主类) .如果 packageFinder 抛出 UncheckedIOException ,则 IOException 原因将被重新抛出。

      如果模块描述符后面有字节,那么这些字节是被读取、忽略还是报告为 InvalidModuleDescriptorException 是实现特定的。如果此方法因 InvalidModuleDescriptorException IOException 而失败,则它可能会在从输入流中读取一些但不是全部字节后执行此操作。强烈建议在出现异常时及时关闭并丢弃该流。

      API 注意:
      packageFinder 参数用于从未在描述符本身中记录包集的遗留模块工件格式读取模块描述符。
      参数:
      in - 输入流
      packageFinder - 可以生产套件的供应商
      返回:
      模块描述符
      抛出:
      InvalidModuleDescriptorException - 如果检测到无效的模块描述符或 packageFinder 返回的包集不包括从模块描述符获得的所有包
      IOException - 如果从输入流读取时发生 I/O 错误,或者包查找器抛出 UncheckedIOException
    • read

      public static ModuleDescriptor  read(InputStream  in) throws IOException
      从输入流中读取模块声明的二进制形式作为模块描述符。此方法完全按照 2-arg read 方法指定的方式工作,但当从流中读取的模块描述符未指示包集时,包查找器不用于查找其他包。
      参数:
      in - 输入流
      返回:
      模块描述符
      抛出:
      InvalidModuleDescriptorException - 如果检测到无效的模块描述符
      IOException - 如果从输入流读取时发生 I/O 错误
    • read

      public static ModuleDescriptor  read(ByteBuffer  bb, Supplier <Set <String >> packageFinder)
      从字节缓冲区读取模块声明的二进制形式作为模块描述符。

      如果字节缓冲区中编码的描述符不指示模块中的一组包,则将调用 packageFinderpackageFinder返回的包集合必须包括模块导出、打开的所有包,以及模块提供的服务实现的包,以及主类的包(如果模块有主类) .如果 packageFinder 抛出 UncheckedIOException ,则 IOException 原因将被重新抛出。

      从索引 p 开始的缓冲区中读取模块描述符,其中 p 是调用此方法时缓冲区的 position 。返回时,缓冲区的位置将等于 p + n,其中 n 是从缓冲区读取的字节数。

      如果模块描述符后面有字节,那么这些字节是被读取、忽略还是报告为 InvalidModuleDescriptorException 是实现特定的。如果此方法因 InvalidModuleDescriptorException 而失败,则它可能会在读取了一些(但不是全部)字节后执行此操作。

      API 注意:
      packageFinder 参数用于从未在描述符本身中记录包集的遗留模块工件格式读取模块描述符。
      参数:
      bb - 字节缓冲区
      packageFinder - 可以生产套件的供应商
      返回:
      模块描述符
      抛出:
      InvalidModuleDescriptorException - 如果检测到无效的模块描述符或 packageFinder 返回的包集不包括从模块描述符获得的所有包
    • read

      public static ModuleDescriptor  read(ByteBuffer  bb)
      从字节缓冲区读取模块声明的二进制形式作为模块描述符。此方法完全按照 2-arg read 方法指定的方式工作,但当缓冲区中编码的模块描述符未指示包集时,包查找器不用于查找其他包。
      参数:
      bb - 字节缓冲区
      返回:
      模块描述符
      抛出:
      InvalidModuleDescriptorException - 如果检测到无效的模块描述符