Java模块反射教程将解释如何通过反射访问Java类所属的模块。
模块的概念是Java 9Java Platform Module System添加的。一个Java模块是一个Java包的集合。因此,每一个类都属于一个包,且每一个包都属于一个模块。
一个Java模块被java.base
模块的反射类java.lang.Module
代表。通过这个类可以和Java模块系统交互,获得给定模块的信息或者修改一个模块。本文将覆盖通过反射类Module
可以做的一些操作。
获得模块实例
可以通过Class
实例获得Module
实例,像这样:
Module myClassModule = MyClass.class.getModule();
是命名模块吗?
你可以通过调用Module isNamed()
检查一个Module
是否代表一个给定名称的模块。这是示例代码:
boolean isNamed = myClassModule.isNamed();
是公开模块吗?
你可以通过调用Module isOpen()
方法检查一个模块是否是开放的, 这是示例代码:
boolean isOpen = myClassModule.isOpen();
获得模块描述符
一旦你访问了Module
实例,你可以通过getDescriptor()
方法访问它的ModuleDescriptor
。这是通过getDescriptor()
访问模块的ModuleDescriptor
的示例代码:
ModuleDescriptor descriptor = myClassModule.getDescriptor();
可以从ModuleDescriptor
获得模块的更多描述信息。Java模块反射教程将通过下面的章节讨论可以从模块描述符中获得的信息。
模块名
你可以通过ModuleDescriptor name()
方法获得模块名。这是示例代码:
String moduleName = descriptor.name();
导出包
可以通过反射,ModuleDescriptor exports()
方法读取模块的包列表。示例代码如下:
Set<ModuleDescriptor.Exports> exports = descriptor.exports();
是自动配置模块吗?
你可以通过ModuleDescriptor isAutomatic()
方法检查模块是否自动配置模块。示例代码如下:
boolean isAutomatic = descriptor.isAutomatic();
是公开模块吗?
你可以通过ModuleDescriptor isOpen()
方法检查模块是否是开放的,示例代码如下:
boolean isOpen = descriptor.isOpen();
模块中的包
你可以通过反射获得一个给定模块的包列表。这是通过ModuleDescriptor packages()
方法实现的。示例代码如下:
Set packages = descriptor.packages();
使用的服务
你也可以通过反射读取一个Java模块使用的服务。模块所使用的服务也被称为模块的服务依赖关系。你可以通过ModuleDescriptor uses()
方法读取模块服务的依赖。示例代码如下:
Set<String> uses = descriptor.uses();
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。