使用代码:
ModuleFinder.of(Paths.get(path)).findAll()
Run Code Online (Sandbox Code Playgroud)
我能够检索Set<ModuleReference>所有 .jar中的一个path的一个。
我的下一步是Module从 a获取 aModuleReference但没有方法返回该值,我可以得到 aModuleDescriptor但即使这样也没有帮助。有没有办法做到这一点?
如果您想访问模块内容,您应该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)
| 归档时间: |
|
| 查看次数: |
623 次 |
| 最近记录: |