- java.lang.Object
-
- java.lang.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()
-
-
方法摘要
所有方法 接口方法 具体的方法 Modifier and Type 方法 描述 Module
addExports(String pn, Module other)
如果调用者的模块是此模块,则更新此模块以将给定的包导出到给定的模块。Module
addOpens(String pn, Module other)
如果该模块已经至少 打开了一个包到调用者模块,然后更新该模块以将包打开到给定的模块。Module
addReads(Module other)
如果调用者的模块是该模块,则更新该模块以读取给定的模块。Module
addUses(Class<?> service)
如果调用者模块是此模块,则更新此模块以添加对给定服务类型的服务依赖。boolean
canRead(Module other)
指示此模块是否读取给定的模块。boolean
canUse(Class<?> service)
指示此模块是否具有对给定服务类型的服务依赖性。<T extends Annotation>
TgetAnnotation(Class<T> annotationClass)
返回该元素的,如果这样的注释 ,否则返回null指定类型的注释。Annotation[]
getAnnotations()
返回此元素上 存在的注释。ClassLoader
getClassLoader()
返回此模块的ClassLoader
。Annotation[]
getDeclaredAnnotations()
返回 直接存在于此元素上的注释。ModuleDescriptor
getDescriptor()
如果此模块是未命名模块,则返回此模块的模块描述符或null
。ModuleLayer
getLayer()
如果此模块不在模块层中,则返回包含此模块的模块层或null
。String
getName()
如果此模块是未命名的模块,则返回模块名称或null
。Set<String>
getPackages()
返回此模块中软件包的软件包名称集。InputStream
getResourceAsStream(String name)
返回用于读取此模块中资源的输入流。boolean
isExported(String pn)
如果此模块无条件导出给定的包,则返回true
。boolean
isExported(String pn, Module other)
如果此模块将给定的包导出至少给定的模块,则返回true
。boolean
isNamed()
如果此模块是命名模块,则返回true
。boolean
isOpen(String pn)
如果此模块无条件 打开包,则返回true
。boolean
isOpen(String pn, Module other)
如果此模块至少 打开了给定的模块,则返回true
。String
toString()
返回此模块的字符串表示形式。-
Methods inherited from interface java.lang.reflect.AnnotatedElement
getAnnotationsByType, getDeclaredAnnotation, getDeclaredAnnotationsByType, isAnnotationPresent
-
-
-
-
方法详细信息
-
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:
-
读取通过此方法添加的
边缘
较弱,并且不可阻止当该模块强力可达时,将其
other
为other
。 - 参数
-
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)
-
isOpen
public boolean isOpen(String pn, Module other)
返回true
如果这个模块已经开了一个包至少给定的模块。如果调用此方法测试此模块中的包是否对其自身打开,则此方法返回
true
。 在模块中使用包装的open
模块调用时,它返回true
。 当在未命名的模块上调用时,它总是返回true
。该方法不检查给定的模块是否读取此模块。
- 参数
-
pn
- 包名称 -
other
- 另一个模块 - 结果
-
true
如果该模块已经 打开包至少给定的模块 - 另请参见:
-
ModuleDescriptor.opens()
,addOpens(String,Module)
,AccessibleObject#setAccessible(boolean)
,MethodHandles.privateLookupIn(java.lang.Class<?>, java.lang.invoke.MethodHandles.Lookup)
-
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
- 如果pn
是null
,或者这是一个命名模块,并且包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
- 如果pn
是null
,或者这是一个命名模块,并且包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)
-
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)
- 如果资源名称以“
-
-