Module java.base
Package java.lang

Class Module

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

public final class Module extends Object implements AnnotatedElement
表示一个运行时模块,可以是 named 或未命名的。

命名模块具有一个 name,当向Java虚拟机定义模块图以创建一个 module layer 时,Java虚拟机会构造这些模块。

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

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

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

参见 Java语言规范:
7.7 模块声明
自版本:
9
另请参阅:
  • Method Details

    • 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
      返回:
      如果此模块可以访问 restricted 方法,则返回 true
      自版本:
      20
    • canRead

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

      public Module addReads(Module other)
      如果调用者的模块是此模块,则更新此模块以读取给定模块。如果 other 是此模块(所有模块都读取自身)、此模块是未命名模块(因为未命名模块读取所有模块)或此模块已经读取 other,则此方法不执行任何操作。
      实现说明:
      此方法添加的 Read edgesweak 的,当此模块是强引用时不会阻止 other 被GC回收。
      参数:
      other - 其他模块
      返回:
      此模块
      抛出:
      IllegalCallerException - 如果此为命名模块且调用者模块不是此模块
      另请参阅:
    • isExported

      public boolean isExported(String pn, Module other)
      返回 true 如果此模块至少向给定模块导出给定包。此方法返回 true 如果调用以测试此模块中的包是否导出给自身。当在未命名模块上调用此方法时,它总是返回 true。在运行时,对给定模块 opened 的包被视为导出给该模块,因此如果包对给定模块 opened,则此方法返回 true
      参数:
      pn - 包名称
      other - 其他模块
      返回:
      如果此模块至少向给定模块导出该包,则返回 true
      另请参阅:
    • isOpen

      public boolean isOpen(String pn, Module other)
      返回 true 如果此模块至少向给定模块 opened 一个包。此方法返回 true 如果调用以测试此模块中的包是否对自身 opened。在具有包的 open 模块上调用此方法时,它返回 true。在未命名模块上调用此方法时,它总是返回 true
      API 注释:
      将包p开放给模块M允许M模块中的代码对包中所有类型进行深度反射。此外,如果M模块读取此模块,则可以获取一个Lookup对象,该对象被允许在包p定义类
      参数:
      pn - 包名
      other - 其他模块
      返回:
      如果此模块已开放至至少给定模块,则返回true
      参见:
    • isExported

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

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

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

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

      public boolean isOpen(String pn)
      返回true如果此模块已无条件开放一个包。

      当在未命名模块上调用时,此方法始终返回true。此外,当在一个带有模块中包的开放模块上调用时,它始终返回true

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

      API 注释:
      将包p开放给模块M允许M模块中的代码对包中所有类型进行深度反射。此外,如果M模块读取此模块,则可以获取一个Lookup对象,该对象被允许在包p定义类
      参数:
      pn - 包名
      返回:
      如果此模块已无条件开放包,则返回true
      参见:
    • addExports

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

      如果包已经导出(或开放)给给定模块,则此方法不起作用。

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

      public Module addOpens(String pn, Module other)
      如果此模块已无条件开放一个包至至少调用者模块,则更新此模块以将包无条件开放给给定模块。使用此方法打开包允许给定模块对包中的所有类型及其所有成员进行反射,而不仅仅是公共类型及其公共成员,当使用支持私有访问或绕过或抑制默认Java语言访问控制检查的API时。

      如果包已经开放给给定模块,则此方法不起作用。

      API 注释:
      此方法可用于消费者模块使用限定开放方式向API模块开放包,但消费者模块中类成员的反射访问被委托给另一个模块中的代码的情况。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 - 服务类型
      返回:
      如果此模块使用服务类型st,则返回true
      参见:
    • getPackages

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

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

      对于未命名模块,返回的集合包含在未命名模块中已经定义的每个包的元素。

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

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

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

      在接口AnnotatedElement中指定:
      getAnnotation in interface AnnotatedElement
      类型参数:
      T - 要查询并返回的注解类型
      参数:
      annotationClass - 对应于注解类型的Class对象
      返回:
      如果此元素上存在指定注解类型的注解,则返回此元素的指定注解,否则返回null
    • getAnnotations

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

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

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

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

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

      指定者:
      getDeclaredAnnotations 在接口 AnnotatedElement
      返回:
      此元素上直接存在的注解
    • getResourceAsStream

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

      命名模块中的资源可能会被封装,以使其无法被其他模块的代码找到。资源是否可以被找到取决于以下情况:

      • 如果资源名称以".class"结尾,则它不会被封装。
      • 从资源名称派生出一个包名称。如果包名称是模块中的一个,则只有当包对调用此方法的调用者至少是开放的模块时,资源才能被此方法的调用者找到。如果资源不在模块的包中,则资源不会被封装。

      在上述情况中,资源的包名称是从名称中最后一个'/'之前的字符子序列派生出来,然后将子序列中的每个'/'字符替换为'.'。在派生包名称时会忽略开头的斜杠。例如,对于名为"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
      返回:
      此模块的字符串表示