Java反射-模块
该Java模块反射教程将说明如何通过Java反射访问Java类所属的Java模块。
Java模块的概念已随Java平台模块系统一起添加到Java 9中。 Java模块是一组Java软件包。因此,每个Java类都属于一个包,而该包则属于一个模块。
Java模块由Java模块java.base
中的Java反射类java.lang.Module
表示。通过此类,我们可以与Java Platform Module System交互以获得有关给定模块的信息,或者修改模块。本教程将介绍一些我们可以通过Java反射对"模块"实例执行的操作。
获取模块实例
我们可以通过Class
实例获得Module
类的实例,如下所示:
Module myClassModule = MyClass.class.getModule();
是命名模块吗?
我们可以通过调用Module
isNamed()方法来检查Module
实例a是否代表命名模块。这是一个例子:
boolean isNamed = myClassModule.isNamed();
是开放模块吗?
我们可以通过Module``isOpen()
方法检查Module
是否为命名模块。这是一个例子:
boolean isOpen = myClassModule.isOpen();
获取模块描述符
一旦可以访问模块实例,就可以通过getDescriptor()方法访问模块实例。这是一个通过getDescriptor()
访问JavaModule
的ModuleDescriptor
的例子:
ModuleDescriptor descriptor = myClassModule.getDescriptor();
从" ModuleDescriptor"中,我们可以读取模块的模块描述符中的信息。该Java模块反射教程将在以下各节中介绍一些我们可以从模块描述符中获得的信息。
模块名称
我们可以通过ModuleDescriptorname()
方法从其模块描述符中获取命名模块的名称。这是通过反射读取Java模块名称的示例:
String moduleName = descriptor.name();
导出的包
我们可以通过ModuleDescriptorexports()
方法,通过Java反射来读取Java模块导出的软件包列表。这是一个从Java模块获取导出的软件包集的示例:
Set<ModuleDescriptor.Exports> exports = descriptor.exports();
是自动模块吗?
我们可以通过ModuleDescriptor
isAutomatic()方法检查Java模块是否为自动模块。这是检查Java模块是否自动的示例:
boolean isAutomatic = descriptor.isAutomatic();
是开放模块吗?
我们可以通过ModuleDescriptor``isOpen()
方法检查Java模块是否为开放模块。这是检查Java模块是否打开的示例:
boolean isOpen = descriptor.isOpen();
模块中的软件包
我们可以通过Java反射来获取给定Java模块中软件包名称的列表。我们可以通过ModuleDescriptor``packages()
方法来实现。这是通过反射获取模块的软件包名称列表的示例:
Set<String> packages = descriptor.packages();
使用的服务
我们也可以通过Java反射来阅读给定Java模块使用的服务。模块使用的服务也称为模块的服务依赖项。我们可以通过ModuleDescriptoruses()
方法读取模块服务依赖项。这是一个如何通过反射读取Java模块的服务依赖项的示例:
Set<String> uses = descriptor.uses();