Module java.base
Package java.lang.module

Class ModuleDescriptor

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

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

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

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

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

自Java版本:
9
参见:
  • Method Details

    • name

      public String name()

      返回模块名称。

      返回:
      模块名称
    • modifiers

      public Set<ModuleDescriptor.Modifier> modifiers()

      返回模块修饰符集。

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

      public Set<AccessFlag> accessFlags()
      返回 模块标志 的集合。
      返回:
      可能为空的不可修改的模块标志集
      参见 Java虚拟机规范:
      4.7.25 模块属性
      自Java版本:
      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对象的模块名称来比较它们。如果模块名称相等,则比较模块版本。在比较模块版本时,具有版本的模块描述符被认为优于没有版本的模块描述符。如果两个版本都是不可解析的,则按字典顺序比较原始版本字符串。如果模块名称相等且版本相等(或两者都不存在),则比较修饰符集。通过为每个集合计算一个二进制值来比较修饰符集。如果修饰符存在于集合中,则其序数位置处的位在二进制值中为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)
      实例化一个构建器以构建普通模块的模块描述符。此方法等效于使用空的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个参数的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个参数的read方法指定的方式完全相同,唯一的区别是当缓冲区中编码的模块描述符没有指示包集时,不使用包查找器来查找额外的包。
      参数:
      bb - 字节缓冲区
      返回:
      模块描述符
      抛出:
      InvalidModuleDescriptorException - 如果检测到无效的模块描述符