如何从 ModuleReference 获取 Module 对象

MrS*_*Sir 5 java java-9

使用代码:

ModuleFinder.of(Paths.get(path)).findAll() 
Run Code Online (Sandbox Code Playgroud)

我能够检索Set<ModuleReference>所有 .jar的一个path的一个。

我的下一步是Module从 a获取 aModuleReference但没有方法返回该值,我可以得到 aModuleDescriptor但即使这样也没有帮助。有没有办法做到这一点?

Nam*_*man 4

如果您想访问模块内容,您应该open访问ModuleReference已获得的内容。ModuleReader这将使您能够访问

适用于需要访问模块中资源的情况

模块中的资源由抽象名称标识,该抽象名称是 '/'- 分隔的路径字符串。例如,模块java.base 可能具有一个资源"java/lang/Object.class",按照惯例,该资源是java.lang.Object. 模块读取器可以将模块内容中的目录视为资源(无论是否是特定于模块读取器的)。如果模块内容包含可作为资源定位的目录,则其名称以斜杠 ( '/') 结尾。还可以使用删除尾部斜杠的名称来定位该目录。

但请记住,文档还指定:

ModuleReader 在创建时打开,并通过调用该 close 方法关闭。未能关闭模块读取器可能会导致资源泄漏。该try-with-resources语句提供了一个有用的构造来确保模块读取器关闭。


从资源中获取 的一种方法Module是使用 as 访问它Class#getModule

Module module = com.foo.bar.YourClass.class.getModule();
Run Code Online (Sandbox Code Playgroud)

编辑:随着时间的推移,我学会了一种更好的方法来使用@Alan所建议的ModuleFinder访问 a,也可能是:Module

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);
Run Code Online (Sandbox Code Playgroud)