Module  java.base
软件包  java.lang

Class Module

  • All Implemented Interfaces:
    AnnotatedElement


    public final class Module
    extends Object
    implements AnnotatedElement
    代表一个运行时模块,无论是named还是未命名的。

    命名的模块有一个name ,并由Java虚拟机构建时,将模块图定义为Java虚拟机以创建一个module layer

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

    作为参数或由此类定义的方法返回的包名称是The Java™ Language Specification第6.5.3节中定义的包的完全限定名称,例如"java.lang"

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

    从以下版本开始:
    9
    另请参见:
    Class.getModule()
    • 方法详细信息

      • isNamed

        public boolean isNamed​()
        如果此模块是命名模块,则返回 true
        结果
        true如果这是一个命名的模块
        另请参见:
        ClassLoader.getUnnamedModule()
      • 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

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

        结果
        包含此模块的模块层
        另请参见:
        Proxy
      • canRead

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

        public Module addReads​(Module other)
        如果调用者的模块是该模块,则更新该模块以读取给定的模块。 此方法是一种无操作如果other是此模块(所有模块读本身),这个模块未命名的模块(如模块无名读所有模块),或者该模块已经读取other
        Implementation Note:
        读取通过此方法添加的 边缘 较弱,并且不可阻止当该模块强力可达时,将其 otherother
        参数
        other - 另一个模块
        结果
        这个模块
        异常
        IllegalCallerException - 如果这是一个命名模块,并且调用者的模块不是此模块
        另请参见:
        canRead(java.lang.Module)
      • isExported

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

        如果调用此方法来测试此模块中的包是否导出到本身,则此方法返回true 当在未命名的模块上调用时,它总是返回true 给定模块的一个包是open被认为是在运行时导出到该模块,因此如果程序包对给定的模块打开,该方法返回true

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

        参数
        pn - 包名称
        other - 另一个模块
        结果
        true如果此模块将包至少导出给定的模块
        另请参见:
        ModuleDescriptor.exports()addExports(String,Module)
      • isExported

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

        当在未命名的模块上调用时,此方法总是返回true 一个无条件的包是opened在运行时无条件导出,所以如果程序包无条件地打开,这个方法返回true

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

        参数
        pn - 包名称
        结果
        true如果此模块无条件导出包
        另请参见:
        ModuleDescriptor.exports()
      • isOpen

        public boolean isOpen​(String pn)
        如果此模块无条件打开包,则返回true

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

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

        参数
        pn - 包名称
        结果
        true如果该模块无条件 打开软件包
        另请参见:
        ModuleDescriptor.opens()
      • addExports

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

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

        API Note:
        The Java™ Virtual Machine Specification第5.4.3节所述,如果由于链接错误而尝试解析符号引用失败,则解析引用的后续尝试将始终失败,因为初始解析尝试导致抛出的错误。
        参数
        pn - 包名称
        other - 模块
        结果
        这个模块
        异常
        IllegalArgumentException - 如果 pnnull ,或者这是一个命名模块,并且包 pn不是此模块中的包
        IllegalCallerException - 如果这是一个命名模块,并且调用者的模块不是此模块
        另请参见:
        isExported(String,Module)
        See The Java™ Virtual Machine Specification:
        5.4.3决议
      • addOpens

        public Module addOpens​(String pn,
                               Module other)
        如果该模块已经至少打开了一个包到调用者模块,然后更新该模块以将包打开到给定的模块。 使用此方法打开包可以允许包中的所有类型,并且其所有成员(不仅仅是公共类型及其公共成员)在使用支持私有访问的API或绕过或抑制默认方式时被给定模块反映出来Java语言访问控制检查。

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

        API Note:
        此方法可用于消费者模块使用限定打开以将包打包到API模块的情况,但是将消费者模块中的类成员的反射访问委托给另一个模块中的代码。 API模块中的代码可以使用此方法将消费者模块中的包打开到另一个模块。
        参数
        pn - 包名称
        other - 模块
        结果
        这个模块
        异常
        IllegalArgumentException - 如果 pnnull ,或者这是一个命名模块,并且包 pn不是此模块中的包
        IllegalCallerException - 如果这是一个命名的模块,并且该模块至少没有打开包到主叫方的模块
        另请参见:
        isOpen(String,Module)AccessibleObject#setAccessible(boolean)MethodHandles.privateLookupIn(java.lang.Class<?>, java.lang.invoke.MethodHandles.Lookup)
      • addUses

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

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

        参数
        service - 服务类型
        结果
        这个模块
        异常
        IllegalCallerException - 如果这是一个命名模块,并且调用者的模块不是此模块
        另请参见:
        canUse(Class)ModuleDescriptor.uses()
      • canUse

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

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

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

        对于未命名的模块,此方法相当于调用此模块的类加载器的getDefinedPackages方法并返回一组包名称。

        结果
        该模块中包的包名称集
      • getAnnotation

        public <T extends Annotation> T getAnnotation​(Class<T> annotationClass)
        返回该元素的,如果这样的注释否则返回null指定类型的注释。 该方法在未命名的模块上调用时返回null
        Specified by:
        getAnnotation在接口 AnnotatedElement
        参数类型
        T - 查询的注释类型,如果存在则返回
        参数
        annotationClass - 对应于注释类型的Class对象
        结果
        该元素的注释指定的注释类型,如果存在于此元素,否则为null
      • getAnnotations

        public Annotation[] getAnnotations​()
        返回此元素上存在的注释。 如果没有存在于此元素上注解,返回值是长度为0这种方法的调用者可以随意修改返回的数组的数组; 它将对返回给其他调用者的数组没有影响。 此方法在未命名的模块上调用时返回一个空数组。
        Specified by:
        getAnnotations在接口 AnnotatedElement
        结果
        此元素上出现的注释
      • getDeclaredAnnotations

        public Annotation[] getDeclaredAnnotations​()
        返回直接存在于此元素上的注释。 此方法忽略继承的注释。 如果此元素上没有直接显示的注释,则返回值为长度为0的数组。此方法的调用者可以自由修改返回的数组; 它将对返回给其他调用者的数组没有影响。 此方法在未命名的模块上调用时返回一个空数组。
        Specified by:
        getDeclaredAnnotations在接口 AnnotatedElement
        结果
        此元素上直接显示的注释
      • getResourceAsStream

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

        命名模块中的资源可能被封装,以便它不能被其他模块中的代码定位。 是否可以找到资源是否确定如下:

        • 如果资源名称以“ .class ”结尾,则不会被封装。
        • 包名称是从资源名称派生的。 如果软件包名称是模块中的一个package ,那么当软件包至少为主叫方的模块时,资源只能由该方法的调用者定位。 如果资源不在模块中的包中,则资源不被封装。

        在上文中,对资源名称是从最后一个之前的字符的子序列衍生'/'在名称,然后替换每个'/'与在子序列字符'.' 导出包名时,将忽略主斜杠。 作为示例,为名称为“ a/b/c/foo.properties ”的资源导出的包名称为“ a.b.c ”。 名称为“ META-INF/MANIFEST.MF ”的资源名称不会被封装,因为“ META-INF ”不是合法的包名称。

        如果资源不在此模块中,则该方法返回null ,资源被封装,并且调用者无法找到该资源,或者访问资源被安全管理器拒绝。

        参数
        name - 资源名称
        结果
        用于读取资源的输入流或 null
        异常
        IOException - 如果发生I / O错误
        另请参见:
        Class.getResourceAsStream(String)
      • toString

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