- 所有实现的接口:
-
Comparable<ModuleDescriptor>
模块描述符描述了一个命名模块,并定义了获取其每个组件的方法。在Java虚拟机中,通过调用 Module
的 getDescriptor
方法来获取命名模块的模块描述符。模块描述符也可以使用 ModuleDescriptor.Builder
类创建,或者通过读取模块声明的二进制形式(module-info.class
)使用此处定义的 read
方法来创建。
模块描述符描述了一个普通、开放或自动模块。 普通 模块和开放模块描述它们的 依赖关系、导出的包
、它们 使用 或 提供 的服务,以及其他组件。 普通 模块可以 开放 特定包。开放模块的模块描述符不声明任何开放包(其 opens
方法返回一个空集),但在Java虚拟机中实例化时,它被视为所有包都是开放的。自动模块的模块描述符不声明任何依赖关系(除了对 java.base
的强制依赖关系),也不声明任何导出或开放包。自动模块在解析过程中接受特殊处理,以便它们读取配置中的所有其他模块。当自动模块在Java虚拟机中实例化时,它读取每个未命名模块,并被视为所有包都是导出和开放的。
ModuleDescriptor
对象是不可变的,可安全地供多个并发线程使用。
- 自Java版本:
- 9
- 参见:
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic final class
用于构建ModuleDescriptor
对象的构建器。static final class
模块导出的包,可以是有资格的或无资格的。static enum
模块上的修饰符。static final class
模块开放的包,可以是有资格的或无资格的。static final class
模块提供一个或多个实现的服务。static final class
对模块的依赖。static final class
模块的版本字符串。 -
Method Summary
Modifier and TypeMethodDescription返回 模块标志 的集合。int
compareTo
(ModuleDescriptor that) 将此模块描述符与另一个进行比较。boolean
使用给定对象测试此模块描述符是否相等。exports()
返回表示导出包的Exports
对象集合。int
hashCode()
为此模块描述符计算哈希码。boolean
如果这是一个自动模块,则返回true
。boolean
isOpen()
如果这是一个开放模块,则返回true
。返回模块的主类。返回模块的修饰符集。name()
返回模块名称。static ModuleDescriptor.Builder
newAutomaticModule
(String name) 实例化一个构建器,用于构建自动模块的模块描述符。static ModuleDescriptor.Builder
实例化一个构建器,用于构建普通模块的模块描述符。static ModuleDescriptor.Builder
newModule
(String name, Set<ModuleDescriptor.Modifier> ms) 实例化一个构建器,用于构建模块描述符。static ModuleDescriptor.Builder
newOpenModule
(String name) 实例化一个构建器,用于构建开放模块的模块描述符。opens()
返回表示开放包的Opens
对象集合。packages()
返回模块中的包集。provides()
返回表示模块提供的服务的Provides
对象集合。返回模块的可能无法解析的版本的字符串。static ModuleDescriptor
read
(InputStream in) 从输入流中读取模块声明的二进制形式作为模块描述符。static ModuleDescriptor
read
(InputStream in, Supplier<Set<String>> packageFinder) 从输入流中读取模块声明的二进制形式作为模块描述符。static ModuleDescriptor
read
(ByteBuffer bb) 从字节缓冲区中读取模块声明的二进制形式作为模块描述符。static ModuleDescriptor
read
(ByteBuffer bb, Supplier<Set<String>> packageFinder) 从字节缓冲区中读取模块声明的二进制形式作为模块描述符。requires()
返回表示模块依赖关系的Requires
对象集合。返回包含模块名称和(如果存在)其版本的字符串。toString()
返回描述模块的字符串。uses()
返回服务依赖关系的集合。version()
返回模块版本。
-
Method Details
-
name
返回模块名称。
- 返回:
- 模块名称
-
modifiers
返回模块修饰符集。
- 返回:
- 可能为空的不可修改的修饰符集
-
accessFlags
返回 模块标志 的集合。- 返回:
- 可能为空的不可修改的模块标志集
- 参见 Java虚拟机规范:
-
4.7.25 模块属性
- 自Java版本:
- 20
- 参见:
-
isOpen
public boolean isOpen()- 返回:
-
true
如果这是一个开放模块
-
isAutomatic
public boolean isAutomatic()- 返回:
-
true
如果这是一个自动模块
-
requires
返回表示模块依赖关系的
Requires
对象集合。当此模块未命名为 "
java.base
" 时,集合中包括对 "java.base
" 的依赖关系。如果此模块是一个自动模块,则除了 "java.base
" 外,它不依赖于任何其他模块。- 返回:
-
可能为空的不可修改的
ModuleDescriptor.Requires
对象集合
-
exports
返回表示导出包的
Exports
对象集合。如果这是一个自动模块,则导出集为空。
- 返回:
- 可能为空的不可修改的导出包集合
-
opens
返回表示开放包的
Opens
对象集合。如果这是一个开放模块或自动模块,则开放包集为空。
- 返回:
- 可能为空的不可修改的开放包集合
-
uses
返回服务依赖关系的集合。
如果这是一个自动模块,则服务依赖关系集为空。
- 返回:
- 可能为空的不可修改的服务类型使用的完全限定类名集合
-
provides
返回表示模块提供的服务的
Provides
对象集合。- 返回:
- 可能为空的不可修改的此模块提供的服务集合
-
version
返回模块版本。
- 返回:
-
此模块的版本,如果模块没有版本或版本是 无法解析的,则返回空的
Optional
-
rawVersion
返回可能无法解析的模块版本的字符串。
- 返回:
-
包含模块版本的字符串,如果模块没有版本,则返回空的
Optional
- 参见:
-
toNameAndVersion
返回包含模块名称和(如果存在)其版本的字符串。
- 返回:
- 包含模块名称和(如果存在)其版本的字符串
-
mainClass
返回模块的主类。
- 返回:
- 模块的主类的完全限定类名
-
packages
返回模块中的包集。包集包括所有导出和开放包,以及任何服务提供者的包和主类的包。
- 返回:
- 可能为空的不可修改的模块中的包集
-
compareTo
比较此模块描述符与另一个模块描述符。通过按字典顺序比较两个
ModuleDescriptor
对象的模块名称来比较它们。如果模块名称相等,则比较模块版本。在比较模块版本时,具有版本的模块描述符被认为优于没有版本的模块描述符。如果两个版本都是不可解析的,则按字典顺序比较原始版本字符串。如果模块名称相等且版本相等(或两者都不存在),则比较修饰符集。通过为每个集合计算一个二进制值来比较修饰符集。如果修饰符存在于集合中,则其序数位置处的位在二进制值中为1
,否则为0
。如果两个修饰符集也相等,则以与equals
一致的方式比较模块描述符的其他组件。- 指定者:
-
compareTo
在接口Comparable<ModuleDescriptor>
- 参数:
-
that
- 要比较的模块描述符 - 返回值:
- 如果此模块描述符小于、等于或大于给定的模块描述符,则为负整数、零或正整数
-
equals
测试此模块描述符与给定对象是否相等。如果给定对象不是
ModuleDescriptor
,则此方法返回false
。如果每个对应的组件都相等,则两个模块描述符相等。此方法满足
Object.equals
方法的一般合同。 -
hashCode
public int hashCode()为此模块描述符计算哈希码。哈希码基于模块描述符的组件,并满足
Object.hashCode
方法的一般合同。 -
toString
返回描述模块的字符串。
-
newModule
实例化一个构建器以构建模块描述符。- 参数:
-
name
- 模块名称 -
ms
- 模块修饰符集 - 返回值:
- 一个新的构建器
- 抛出:
-
IllegalArgumentException
- 如果模块名称为null
或不是合法的模块名称,或者修饰符集包含其他修饰符与AUTOMATIC
-
newModule
- 参数:
-
name
- 模块名称 - 返回值:
- 一个新的构建器
- 抛出:
-
IllegalArgumentException
- 如果模块名称为null
或不是合法的模块名称
-
newOpenModule
- 参数:
-
name
- 模块名称 - 返回值:
- 一个构建开放模块的新构建器
- 抛出:
-
IllegalArgumentException
- 如果模块名称为null
或不是合法的模块名称
-
newAutomaticModule
- 参数:
-
name
- 模块名称 - 返回值:
- 一个构建自动模块的新构建器
- 抛出:
-
IllegalArgumentException
- 如果模块名称为null
或不是合法的模块名称 - 另请参阅:
-
read
public static ModuleDescriptor read(InputStream in, Supplier<Set<String>> packageFinder) throws IOException 从输入流中读取模块声明的二进制形式作为模块描述符。如果输入流中编码的描述符不指示模块中的一组包,则将调用
packageFinder
。packageFinder
返回的包集必须包括模块导出的所有包、开放的包,以及模块提供的服务实现的包和主类的包(如果模块有主类)。如果packageFinder
抛出UncheckedIOException
,则将重新抛出IOException
原因。如果模块描述符后面还有字节,则根据实现来决定这些字节是读取、忽略还是报告为
InvalidModuleDescriptorException
。如果此方法失败并出现InvalidModuleDescriptorException
或IOException
,则可能在从输入流中读取一些但不是全部字节后发生。强烈建议如果发生异常,则立即关闭并丢弃流。- API注释:
-
packageFinder
参数用于从不记录描述符本身中的包集的传统模块构件格式中读取模块描述符时使用。 - 参数:
-
in
- 输入流 -
packageFinder
- 可以生成包集的供应商 - 返回值:
- 模块描述符
- 抛出:
-
InvalidModuleDescriptorException
- 如果检测到无效的模块描述符或packageFinder
返回的包集不包括从模块描述符获取的所有包 -
IOException
- 如果从输入流读取时发生I/O错误或UncheckedIOException
由包查找器抛出
-
read
从输入流中读取模块声明的二进制形式作为模块描述符。此方法与2个参数的read
方法指定的方式完全相同,唯一的区别是当从流中读取的模块描述符不指示包集时,不使用包查找器来查找额外的包。- 参数:
-
in
- 输入流 - 返回值:
- 模块描述符
- 抛出:
-
InvalidModuleDescriptorException
- 如果检测到无效的模块描述符 -
IOException
- 如果从输入流读取时发生I/O错误
-
read
从字节缓冲区中读取模块声明的二进制形式作为模块描述符。如果字节缓冲区中编码的描述符没有指示模块中的一组包,则将调用
packageFinder
。packageFinder
返回的包集必须包括模块导出的所有包、打开的包,以及模块提供的服务实现的包,以及主类的包(如果模块有主类)。 如果packageFinder
抛出UncheckedIOException
,则将重新抛出IOException
原因。模块描述符从索引
p
开始从缓冲区中读取,其中p
是调用此方法时缓冲区的position
。 返回时,缓冲区的位置将等于p + n
,其中n
是从缓冲区中读取的字节数。如果模块描述符后面还有字节,则根据实现情况决定是读取、忽略还是报告为
InvalidModuleDescriptorException
。 如果此方法由于InvalidModuleDescriptorException
而失败,则可能在读取一些但不是全部字节后失败。- API注释:
-
当从不记录描述符本身中的包集的传统模块构件格式中读取模块描述符时,
packageFinder
参数用于使用。 - 参数:
-
bb
- 字节缓冲区 -
packageFinder
- 可生成包集的供应商 - 返回:
- 模块描述符
- 抛出:
-
InvalidModuleDescriptorException
- 如果检测到无效的模块描述符或packageFinder
返回的包集不包括从模块描述符获取的所有包
-
read
从字节缓冲区中读取模块声明的二进制形式作为模块描述符。 此方法与2个参数的read
方法指定的方式完全相同,唯一的区别是当缓冲区中编码的模块描述符没有指示包集时,不使用包查找器来查找额外的包。- 参数:
-
bb
- 字节缓冲区 - 返回:
- 模块描述符
- 抛出:
-
InvalidModuleDescriptorException
- 如果检测到无效的模块描述符
-