Module  java.base
软件包  java.lang.module

Class ModuleDescriptor

  • All Implemented Interfaces:
    Comparable<ModuleDescriptor>


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

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

    模块描述符描述一个正常的 ,开放的或自动的模块。 普通模块和开放式模块描述他们dependencesexported-packages ,服务他们use或者provide ,和其他组件。 正常模块可能是open具体包。 开放模块的模块描述符不声明任何打开的软件包(其opens方法返回一个空集合),但是在Java虚拟机中实例化时,将被视为打开所有软件包。 自动模块的模块描述符不声明任何依赖关系(除了对java.base的强制依赖性),也不声明任何导出或打开的包。 自动模块在分辨率期间接收特殊处理,以便它们读取配置中的所有其他模块。 当在Java虚拟机中实例化自动模块时,它会读取每个未命名的模块,并将其视为导出并打开所有软件包。

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

    从以下版本开始:
    9
    另请参见:
    Module
    • 方法详细信息

      • name

        public String name​()

        返回模块名称。

        结果
        模块名称
      • modifiers

        public Set<ModuleDescriptor.Modifier> modifiers​()

        返回一组模块修饰符。

        结果
        一个可能是空的不可修改的一组修饰符
      • 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对象的集合。

        结果
        该模块提供的可能为空的不可修改的服务集
      • rawVersion

        public Optional<String> rawVersion​()

        返回具有可能不可粗体版本的模块的字符串

        结果
        包含模块版本的字符串或空的 Optional如果模块没有版本
        另请参见:
        version()
      • toNameAndVersion

        public String toNameAndVersion​()

        返回一个包含模块名称的字符串,如果存在,则显示其版本。

        结果
        包含模块名称的字符串,如果存在,则为其版本
      • mainClass

        public Optional<String> mainClass​()

        返回模块主类。

        结果
        模块主类的完全限定类名
      • packages

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

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

        结果
        模块中可能为空的不可修改的包的集合
      • compareTo

        public int compareTo​(ModuleDescriptor that)
        将此模块描述符与其他描述符进行比较

        比较两个ModuleDescriptor对象,比较它们的模块名称。 如果模块名称相等,则比较模块版本。 当比较模块版本时,具有版本的模块描述符被认为是使没有版本的模块描述符成功。 如果两个版本都是unparseable,那么raw version strings在字典上被比较。 如果模块名称相等并且版本相等(或两者都不存在),则比较一组修饰符。 通过比较为每个集合计算的二进制值来比较一组修饰符。 如果改性剂是存在于所述组,然后在它的顺序的位置的位是1二进制值,否则0 如果两组修饰符也相等,则与equals一致的方式比较模块描述符的其他组件。

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

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

        如果给定的对象不是一个ModuleDescriptor那么这个方法返回false 如果两个模块描述符的每个相应的组件相等,则相等。

        该方法满足Object.equals方法的一般合同。

        重写:
        equals在类 Object
        参数
        ob - 要比较此对象的对象
        结果
        true如果并且只有给定的对象是等于该模块描述符的模块描述符
        另请参见:
        Object.hashCode()HashMap
      • toString

        public String toString​()

        返回描述模块的字符串。

        重写:
        toStringObject
        结果
        描述模块的字符串
      • 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或不是合法的模块名称
        另请参见:
        ModuleFinder.of(Path[])
      • read

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

        如果在输入流中编码的描述符不表示模块中的一组程序包,则将调用packageFinder packageFinder返回的包的packageFinder必须包括模块导出的所有包,打开,以及模块提供的服务实现的包以及主类的包(如果该模块有一个主类) 。 如果packageFinder抛出一个UncheckedIOException那么IOException原因会被重新抛出。

        如果在模块描述符之后有字节,那么这个字节是否被读取,忽略或报告为InvalidModuleDescriptorExceptionInvalidModuleDescriptorException 如果这个方法失败了一个InvalidModuleDescriptorExceptionIOException那么它可以在从输入流读取一些但不是全部的字节之后这样做。 强烈建议如果发生异常,则会立即关闭该流。

        API Note:
        当从传统模块 - 工件格式读取模块描述符时,不会在描述符本身中记录一组程序包时使用 packageFinder参数。
        参数
        in - 输入流
        packageFinder - 可以生产一套包装的供应商
        结果
        模块描述符
        异常
        InvalidModuleDescriptorException - 如果检测到无效的模块描述符,或由 packageFinder返回的软件包集不包括从模块描述符获得的所有软件包
        IOException - 如果从输入流读取I / O错误,或者由查找器抛出 UncheckedIOException
      • read

        public static ModuleDescriptor read​(InputStream in)
                                     throws IOException
        从输入流读取模块声明的二进制形式作为模块描述符。 该方法的工作原理与2-arg read方法所指定的不同,当从流读取的模块描述符未显示该包的集合时,不使用packager finder来查找其他包。
        参数
        in - 输入流
        结果
        模块描述符
        异常
        InvalidModuleDescriptorException - 如果检测到无效的模块描述符
        IOException - 如果从输入流读取I / O错误
      • read

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

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

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

        如果模块描述符后面有字节,那么这个字节是否被读取,忽略或报告为InvalidModuleDescriptorExceptionInvalidModuleDescriptorException 如果这个方法失败了一个InvalidModuleDescriptorException那么它可能会在一些但不是全部的字节被读取之后这样做。

        API Note:
        当从传统的模块 - 工件格式读取模块描述符时,不会在描述符本身中记录一组程序包时使用 packageFinder参数。
        参数
        bb - 字节缓冲区
        packageFinder - 可以生产该套装的供应商
        结果
        模块描述符
        异常
        InvalidModuleDescriptorException - 如果检测到无效的模块描述符,或由 packageFinder返回的包的 packageFinder不包括从模块描述符获得的所有软件包
      • read

        public static ModuleDescriptor read​(ByteBuffer bb)
        从字节缓冲区中读取模块声明的二进制形式作为模块描述符。 该方法的工作原理与2-arg read方法所指定的相同,但是当缓冲区中编码的模块描述符不表示包的集合时,不使用packager finder来查找其他包。
        参数
        bb - 字节缓冲区
        结果
        模块描述符
        异常
        InvalidModuleDescriptorException - 如果检测到无效的模块描述符