模块 java.base
 java.lang

类 Module

java.lang.Object
java.lang.Module
所有已实现的接口:
AnnotatedElement

public final class Module extends Object implements AnnotatedElement
表示运行时模块,named 或未命名。

命名模块有一个 name 并且在为 Java 虚拟机定义模块图以创建 模块层 时由 Java 虚拟机构建。

未命名的模块没有名称。每个 ClassLoader 都有一个未命名的模块,通过调用其 getUnnamedModule 方法获得。不在命名模块中的所有类型都是其定义类加载器的未命名模块的成员。

作为参数或由此类中定义的方法返回的包名称是在 6.5.3 节中定义的包的完全限定名称Java 语言规范,例如 "java.lang"

除非另有说明,否则将 null 参数传递给此类中的方法会导致抛出 NullPointerException

Java 语言规范:
7.7 模块声明
自从:
9
参见:
  • 方法详情

    • isNamed

      public boolean isNamed()
      如果此模块是命名模块,则返回 true
      返回:
      true 如果这是一个命名模块
      Java 语言规范:
      7.7.5 未命名模块
      参见:
    • getName

      public String  getName()
      如果此模块是未命名模块,则返回模块名称或 null
      返回:
      模块名称
    • getClassLoader

      public ClassLoader  getClassLoader()
      返回此模块的 ClassLoader

      如果有一个安全管理器,那么它的 checkPermission 方法如果首先以 RuntimePermission("getClassLoader") 权限调用,以检查是否允许调用者访问类加载器。

      返回:
      该模块的类加载器
      抛出:
      SecurityException - 如果安全经理拒绝
    • getDescriptor

      public ModuleDescriptor  getDescriptor()
      返回此模块的模块描述符,如果此模块是未命名模块,则返回 null
      返回:
      该模块的模块描述符
    • getLayer

      public ModuleLayer  getLayer()
      返回包含此模块的模块层,如果此模块不在模块层中,则返回 null。模块层包含命名模块,因此在未命名模块上调用时,此方法始终返回 null

      动态模块 是在运行时生成的命名模块。动态模块可能在也可能不在模块层中。

      返回:
      包含该模块的模块层
      参见:
    • isNativeAccessEnabled

      public boolean isNativeAccessEnabled()
      isNativeAccessEnabled 是 Java 平台的预览 API。
      程序只能在启用预览功能时使用 isNativeAccessEnabled
      预览功能可能会在未来的版本中删除,或升级为 Java 平台的永久功能。
      如果此模块可以访问 restricted 方法,则返回 true
      返回:
      true 如果此模块可以访问 restricted 方法。
      自从:
      20
    • canRead

      public boolean canRead(Module  other)
      指示此模块是否读取给定模块。如果调用此方法来测试此模块是否读取自身,则此方法返回 true。如果在未命名模块上调用它也会返回 true(因为未命名模块读取所有模块)。
      参数:
      other - 另一个模块
      返回:
      true 如果此模块读取 other
      参见:
    • addReads

      public Module  addReads(Module  other)
      如果调用者的模块是这个模块,那么更新这个模块以读取给定的模块。如果 other 是这个模块(所有模块自己读取)、这个模块是一个未命名的模块(因为未命名模块读取所有模块),或者这个模块已经读取了 other,则此方法是空操作。
      实现注意事项:
      通过此方法添加的 Read edgesweak,并且当此模块可强访问时,不会阻止 other 被 GC。
      参数:
      other - 另一个模块
      返回:
      这个模块
      抛出:
      IllegalCallerException - 如果这是一个命名模块并且调用者的模块不是这个模块
      参见:
    • isExported

      public boolean isExported(String  pn, Module  other)
      如果此模块至少将给定包导出到给定模块,则返回 true

      如果调用此方法来测试此模块中的包是否导出到自身,则此方法返回 true。在未命名模块上调用时,它总是返回 trueopen 到给定模块的包被视为在运行时导出到该模块,因此如果包对给定模块开放,则此方法返回 true

      此方法不检查给定模块是否读取此模块。

      参数:
      pn - 包名
      other - 另一个模块
      返回:
      true 如果此模块至少将包导出到给定模块
      参见:
    • isOpen

      public boolean isOpen(String  pn, Module  other)
      如果此模块有 opened 至少给定模块的包,则返回 true

      如果调用此方法来测试此模块中的包是否对自身开放,则此方法返回 true。当在模块中包含包的 open 模块上调用时,它返回 true。在未命名模块上调用时,它总是返回 true

      此方法不检查给定模块是否读取此模块。

      参数:
      pn - 包名
      other - 另一个模块
      返回:
      true 如果此模块具有 opened 至少给定模块的包
      参见:
    • isExported

      public boolean isExported(String  pn)
      如果此模块无条件导出给定包,则返回 true

      在未命名模块上调用时,此方法始终返回 true。无条件为 opened 的包被视为在运行时无条件导出,因此如果无条件打开包,则此方法返回 true

      此方法不检查给定模块是否读取此模块。

      参数:
      pn - 包名
      返回:
      true 如果此模块无条件导出包
      参见:
    • isOpen

      public boolean isOpen(String  pn)
      如果此模块无条件地具有 opened 包,则返回 true

      在未命名模块上调用时,此方法始终返回 true。此外,当在模块中有包的 open 模块上调用时,它总是返回 true

      此方法不检查给定模块是否读取此模块。

      参数:
      pn - 包名
      返回:
      true 如果此模块无条件地具有 opened
      参见:
    • addExports

      public Module  addExports(String  pn, Module  other)
      如果调用者的模块是此模块,则更新此模块以将给定的包导出到给定的模块。

      如果包已经导出(或 open )到给定模块,则此方法无效。

      API 注意:
      如第 5.4.3 节所述Java 虚拟机规范,如果尝试解析符号引用由于链接错误而失败,则后续解析引用的尝试总是会失败,并出现与初始解析尝试相同的错误。
      参数:
      pn - 包名
      other - 模块
      返回:
      这个模块
      抛出:
      IllegalArgumentException - 如果 pnnull,或者这是一个命名模块并且包 pn 不是该模块中的包
      IllegalCallerException - 如果这是一个命名模块并且调用者的模块不是这个模块
      Java 虚拟机规范:
      5.4.3 分辨率
      参见:
    • addOpens

      public Module  addOpens(String  pn, Module  other)
      如果此模块至少包含 opened 调用程序模块的包,则更新此模块以打开给定模块的包。使用此方法打开包允许包中的所有类型及其所有成员,而不仅仅是公共类型及其公共成员,在使用支持私有访问的 API 或绕过或抑制默认值的方法时由给定模块反映Java 语言访问控制检查。

      如果包已经 open 到给定模块,则此方法无效。

      API 注意:
      此方法可用于以下情况:consumer module 使用限定 opens 打开包到 API module,但对使用者模块中类成员的反射访问被委托给另一个模块中的代码。 API 模块中的代码可以使用此方法将消费者模块中的包打开给其他模块。
      参数:
      pn - 包名
      other - 模块
      返回:
      这个模块
      抛出:
      IllegalArgumentException - 如果 pnnull,或者这是一个命名模块并且包 pn 不是该模块中的包
      IllegalCallerException - 如果这是一个命名模块,并且这个模块至少没有打开调用者模块的包
      参见:
    • addUses

      public Module  addUses(Class <?> service)
      如果调用者的模块是此模块,则更新此模块以添加对给定服务类型的服务依赖。此方法旨在供代表其他模块调用 ServiceLoader 的框架使用,或者由其他代码向框架传递对服务类型的引用。在未命名模块或自动模块上调用时,此方法是空操作。

      此方法不会导致 resolveAndBind 重新运行。

      参数:
      service - 服务类型
      返回:
      这个模块
      抛出:
      IllegalCallerException - 如果这是一个命名模块并且调用者的模块不是这个模块
      参见:
    • canUse

      public boolean canUse(Class <?> service)
      指示此模块是否具有对给定服务类型的服务依赖性。在未命名模块或自动模块上调用时,此方法始终返回 true
      参数:
      service - 服务类型
      返回:
      true 如果此模块使用服务类型 st
      参见:
    • getPackages

      public Set <String > getPackages()
      返回此模块中包的包名称集。

      对于命名模块,返回的集合包含模块中每个包的一个元素。

      对于未命名模块,返回的集合包含未命名模块中 has been defined 的每个包的元素。

      返回:
      此模块中包的包名称集
    • getAnnotation

      public <T extends Annotation > T getAnnotation(Class <T> annotationClass)
      如果此类注解为 present ,则返回此元素针对指定类型的注解,否则为 null。在未命名模块上调用时,此方法返回 null

      请注意,此方法返回的任何注解都是声明注解。

      指定者:
      getAnnotation 在接口 AnnotatedElement
      类型参数:
      T - 要查询并返回的注释类型(如果存在)
      参数:
      annotationClass——注解类型对应的Class对象
      返回:
      如果此元素上存在此元素的指定注解类型的注解,则为 null
    • getAnnotations

      public Annotation [] getAnnotations()
      返回此元素上的 present 注释。如果该元素上没有注解present,则返回值为长度为0的数组。该方法的调用者可以自由修改返回的数组;它不会影响返回给其他调用者的数组。在未命名模块上调用时,此方法返回一个空数组。

      请注意,此方法返回的任何注释都是声明注解。

      指定者:
      getAnnotations 在接口 AnnotatedElement
      返回:
      此元素上的注释
    • getDeclaredAnnotations

      public Annotation [] getDeclaredAnnotations()
      返回此元素上的 directly present 注释。此方法忽略继承的注释。如果该元素上没有注解directly present,则返回值为长度为0的数组。该方法的调用者可以自由修改返回的数组;它不会影响返回给其他调用者的数组。在未命名模块上调用时,此方法返回一个空数组。

      请注意,此方法返回的任何注释都是声明注解。

      指定者:
      getDeclaredAnnotations 在接口 AnnotatedElement
      返回:
      注释直接出现在这个元素上
    • getResourceAsStream

      public InputStream  getResourceAsStream(String  name) throws IOException
      返回用于读取此模块中资源的输入流。 name 参数是一个 '/' 分隔的路径名,用于标识资源。与 Class.getResourceAsStream 一样,此方法委托给模块的类加载器 findResource(String,String) 方法,使用模块名称(或 null 当模块未命名时)和资源名称调用它。如果资源名称有前导斜杠,则在委托之前将其删除。

      命名模块中的资源可能是 encapsulated,因此其他模块中的代码无法定位它。资源是否可以被定位的判断方式如下:

      • 如果资源名称以“.class”结尾,那么它不会被封装。
      • package name 派生自资源名称。如果模块中的包名称是 ,则只有当包至少是调用者模块的 open 时,此方法的调用者才能定位资源。如果资源不在模块的包中,则资源不被封装。

      在上面,资源的 package name 来自名称中最后一个 '/' 之前的字符子序列,然后用 '.' 替换子序列中的每个 '/' 字符。派生包名称时忽略前导斜杠。例如,为名为“a/b/c/foo.properties”的资源派生的包名称是“a.b.c”。名称为“META-INF/MANIFEST.MF”的资源名称永远不会被封装,因为“META-INF”不是合法的包名称。

      该方法返回null如果资源不在这个模块中,资源被封装并且不能被调用者定位,或者访问资源被安全管理器拒绝。

      参数:
      name - 资源名称
      返回:
      用于读取资源或 null 的输入流
      抛出:
      IOException - 如果发生 I/O 错误
      参见:
    • toString

      public String  toString()
      返回此模块的字符串表示形式。对于命名模块,表示形式是字符串 "module" ,后跟一个空格,然后是模块名称。对于未命名模块,表示形式是字符串 "unnamed module" ,后跟一个空格,然后是标识未命名模块的特定于实现的字符串。
      重写:
      toString 在类 Object
      返回:
      该模块的字符串表示