使用代码:
ModuleFinder.of(Paths.get(path)).findAll()
我能够检索path
文件夹中所有***.jars***的Set<ModuleReference>
。
我的下一步是从ModuleReference
得到Module
,但没有方法返回它,我可以得到ModuleDescriptor
,但即使这样也没有帮助,有办法做到这一点吗?
使用代码:
ModuleFinder.of(Paths.get(path)).findAll()
我能够检索path
文件夹中所有***.jars***的Set<ModuleReference>
。
我的下一步是从ModuleReference
得到Module
,但没有方法返回它,我可以得到ModuleDescriptor
,但即使这样也没有帮助,有办法做到这一点吗?
2条答案
按热度按时间8ftvxx2r1#
如果你想访问 * 模块内容 *,你应该
open
你已经达到的ModuleReference
。这将为你提供访问ModuleReader
的权限。用于需要访问模块中的资源的情况
模块中的资源由抽象名称标识,该抽象名称是以
'/'
分隔的路径字符串。例如,模块java.base
可能有一个资源"java/lang/Object.class"
,按照惯例,是java.lang.Object
的类文件。模块读取器可以将模块内容中的目录视为资源如果模块内容包含可以作为资源定位的目录,则其名称以斜杠结尾('/'
)。也可以使用去掉尾部斜杠的名称来定位该目录。但请记住,文档还指定:
ModuleReader在创建时打开,并通过调用
close
方法关闭。未能关闭模块读取器可能会导致资源泄漏。try-with-resources
语句提供了一个有用的构造,以确保模块读取器被关闭。从资源中获取
Module
的一种方法是使用Class#getModule
访问它:编辑:我已经学会了一个更好的方法来使用
ModuleFinder
访问Module
,正如@Alan所建议的那样,可能是:oyxsuwqo2#
java.lang.module中的类更多的是模型世界。看看
java.lang.module.Configuration
和java.lang.ModuleLayer
,看看如何创建一个配置,并在Java虚拟机中将其示例化为一个模块层。在ModuleLayer
javadoc中有一个代码片段,可能会让你开始,只是要注意,这是一个高级主题,最好先掌握基础知识。ModuleLayer
中的示例(取自JDK 19):此示例通过解析名为“myapp”的模块来创建配置,并将 Boot 层的配置作为父层。然后,它使用此配置中的模块创建新层。所有模块都定义到同一个类加载器。