如何从 ModuleReference 中获取 Module 对象

问题描述 投票:0回答:2

使用代码:

ModuleFinder.of(Paths.get(path)).findAll() 

我能够在

Set<ModuleReference>
文件夹中检索所有.jars
path

我的下一步是从

Module
 得到一个 
ModuleReference
但没有方法返回它,我可以得到一个
ModuleDescriptor
但即使那个也无济于事。有没有办法做到这一点?

java java-9
2个回答
4
投票

如果您想访问模块内容,您应该

open
您已经获得的
ModuleReference
。 这将使您能够访问
ModuleReader
which

适用于访问模块中的资源的情况 必填

模块中的资源由抽象名称标识,该抽象名称是

'/'
分隔的路径字符串。例如,模块
java.base
可能有资源
"java/lang/Object.class"
,按照惯例, 是
java.lang.Object
的类文件。模块阅读器可以处理 模块内容中的目录作为资源(无论是否 模块阅读器特定)。模块内容包含目录的位置 可以定位为资源,然后其名称以斜杠 (
'/'
) 结尾。该目录也可以使用删除尾部斜杠的名称来定位。

请记住,文档还指定:

ModuleReader 在创建时打开,并通过调用

close
方法。未能关闭模块阅读器可能会导致资源 泄露。
try-with-resources
语句提供了一个有用的结构来 确保模块阅读器已关闭。


从资源中获取

Module
的一种方法是使用
Class#getModule
访问它,如下所示:

Module module = com.foo.bar.YourClass.class.getModule();

编辑:随着时间的推移,我学会了一种更好的方法来使用

ModuleFinder
访问
Module
,正如@Alan所建议的那样也可能是:

ModuleFinder finder = ModuleFinder.of(path);
ModuleLayer parent = ModuleLayer.boot();
Configuration configuration = parent.configuration().resolve(finder, ModuleFinder.of(), Set.of("curious")); // 'curious' being the name of the module
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
ModuleLayer layer = parent.defineModulesWithOneLoader(configuration, systemClassLoader);

Module m = layer.findModule("curious").orElse(null);

3
投票

java.lang.module 中的类更多的是模型世界。查看

java.lang.module.Configuration
java.lang.ModuleLayer
以了解如何创建配置并将其作为模块层在 Java 虚拟机中实例化。
ModuleLayer
javadoc 中有一个代码片段可能会让您继续前进,请注意这是一个高级主题,最好先掌握基础知识。

© www.soinside.com 2019 - 2024. All rights reserved.