如何从ModuleReference获取Module对象

时间:2017-09-12 15:18:31

标签: java java-9

使用代码:

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

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

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

2 个答案:

答案 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中有一个代码片段,可能会让你前进,只是被警告这是一个高级主题,最好先掌握基础知识。