使用代码:
ModuleFinder.of(Paths.get(path)).findAll()
我可以检索Set<ModuleReference>
文件夹中所有 .jars 的path
。
我的下一步是从ModuleReference
获得Module
,但没有方法可以返回,我可以获得ModuleDescriptor
,但即使是那个也无济于事。有没有办法做到这一点?
答案 0 :(得分:3)
如果您想访问模块内容,您应该https://jsfiddle.net/bhb5xqqq/1/获得ModuleReference
。
这样您就可以访问open
适用于访问模块中资源的情况 需要
模块中的资源由一个抽象名称标识
'/'
- 分隔的路径字符串。例如,模块java.base
按惯例,可能有一个资源"java/lang/Object.class"
是java.lang.Object
的类文件。模块阅读器可以治疗 模块内容中的目录作为资源(无论是否存在) 模块阅读器具体)。模块内容包含目录的位置 可以作为资源定位,然后其名称以斜杠('/'
)结尾。也可以使用删除尾部斜杠的名称来定位目录。
请注意,文档还指明:
ModuleReader在创建时打开,并通过调用来关闭
ModuleReader
方法。未能关闭模块阅读器可能会导致资源 泄漏。close
语句提供了一个有用的构造 确保关闭模块阅读器。
从资源中获取Module
的一种方法是使用try-with-resources
访问它:
Module module = com.foo.bar.YourClass.class.getModule();
编辑 :我已经及时了解了使用ModuleFinder
访问Module
的更好方法,如{{3也可能是:
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);
答案 1 :(得分:2)
java.lang.module中的类是更多的模型世界。查看j.l.module.Configuration和j.l.ModuleLayer,了解如何创建配置并在Java虚拟机中将其实例化为一个模块层。 ModuleLayer javadoc中有一个代码片段,可能会让你前进,只是被警告这是一个高级主题,最好先掌握基础知识。