模块  java.base
软件包  java.lang

Class Module

  • 实现的所有接口
    AnnotatedElement

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

    命名模块具有name并且当为Java虚拟机定义模块图以创建module layer时 ,由Java虚拟机构

    未命名的模块没有名称。 每个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​(模块 other)
        指示此模块是否读取给定模块。 如果调用此方法读取自身,则此方法返回true 如果在未命名的模块上调用它也会返回true (因为未命名的模块读取所有模块)。
        参数
        other - 其他模块
        结果
        true如果此模块读取 other
        另请参见:
        addReads(Module)
      • addReads

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

        public boolean isExported​(String pn,
                                  模块 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 模块 addExports​(String pn,
                                 模块 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 模块 addOpens​(String pn,
                               模块 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 模块 addUses​(<?> service)
        如果调用者的模块是此模块,则更新此模块以添加对给定服务类型的服务依赖性。 此方法旨在供代表其他模块调用ServiceLoader的框架使用,或者框架通过其他代码传递对服务类型的引用。 在未命名的模块或自动模块上调用时,此方法是无操作。

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

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

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

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

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

        对于未命名的模块,此方法等效于调用此模块的类加载器的getDefinedPackages方法并返回包名称集。

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

        public <T extends Annotation> T getAnnotation​(<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 in interface AnnotatedElement
        结果
        注释直接出现在此元素上
      • getResourceAsStream

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

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

        • 如果资源名称以“ .class ”结尾,则它不会被封装。
        • 包名称源自资源名称。 如果软件包名称是模块中的package ,则当软件包为open时,该资源只能由此方法的调用者定位到至少调用方的模块。 如果资源不在模块的包中,则不封装资源。

        在上文中,对资源名称是从最后一个之前的字符的子序列衍生'/'在名称,然后替换每个'/'与在子序列字符'.' 导出包名称时会忽略前导斜杠。 例如,为名为“ 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
        结果
        此模块的字符串表示形式