- java.lang.Object
-
- java.lang.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()
-
-
方法摘要
所有方法 实例方法 具体的方法 变量和类型 方法 描述 模块
addExports(String pn, 模块 other)
如果调用者的模块是此模块,则更新此模块以将给定包导出到给定模块。模块
addOpens(String pn, 模块 other)
如果此模块已 打开至少调用程序模块的程序包,则更新此模块以打开指定模块的程序包。模块
addReads(模块 other)
如果调用者的模块是该模块,则更新该模块以读取给定模块。模块
addUses(类<?> service)
如果调用者的模块是此模块,则更新此模块以添加对给定服务类型的服务依赖性。boolean
canRead(模块 other)
指示此模块是否读取给定模块。boolean
canUse(类<?> service)
指示此模块是否具有对给定服务类型的服务依赖性。<T extends Annotation>
TgetAnnotation(类<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, 模块 other)
如果此模块将给定包导出到至少给定模块,则返回true
。boolean
isNamed()
如果此模块是命名模块,则返回true
。boolean
isOpen(String pn)
如果此模块无条件 打开包,则返回true
。boolean
isOpen(String pn, 模块 other)
如果此模块已 打开至少给定模块的包,则返回true
。String
toString()
返回此模块的字符串表示形式。-
声明方法的类 java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
声明方法的接口 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(模块 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)
-
isOpen
public boolean isOpen(String pn, 模块 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)
- 参数
-
pn
- 包名称 - 结果
-
true
如果此模块无条件 打开包 - 另请参见:
-
ModuleDescriptor.opens()
-
addExports
public 模块 addExports(String pn, 模块 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 模块 addOpens(String pn, 模块 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 模块 addUses(类<?> service)
如果调用者的模块是此模块,则更新此模块以添加对给定服务类型的服务依赖性。 此方法旨在供代表其他模块调用ServiceLoader
的框架使用,或者框架通过其他代码传递对服务类型的引用。 在未命名的模块或自动模块上调用时,此方法是无操作。此方法不会导致重新运行
resolveAndBind
。- 参数
-
service
- 服务类型 - 结果
- 这个模块
- 异常
-
IllegalCallerException
- 如果这是一个命名模块,并且调用者的模块不是此模块 - 另请参见:
-
canUse(Class)
,ModuleDescriptor.uses()
-
canUse
public boolean canUse(类<?> service)
指示此模块是否具有对给定服务类型的服务依赖性。 在未命名的模块或自动模块上调用时,此方法始终返回true
。- 参数
-
service
- 服务类型 - 结果
-
true
如果此模块使用服务类型st
- 另请参见:
-
addUses(Class)
-
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 interfaceAnnotatedElement
- 结果
- 注释直接出现在此元素上
-
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)
- 如果资源名称以“
-
-