java 如何从ModuleReference获取Module对象

bqf10yzr  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(117)

使用代码:

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

我能够检索path文件夹中所有***.jars***的Set<ModuleReference>
我的下一步是从ModuleReference得到Module,但没有方法返回它,我可以得到ModuleDescriptor,但即使这样也没有帮助,有办法做到这一点吗?

8ftvxx2r

8ftvxx2r1#

如果你想访问 * 模块内容 *,你应该open你已经达到的ModuleReference。这将为你提供访问ModuleReader的权限。
用于需要访问模块中的资源的情况
模块中的资源由抽象名称标识,该抽象名称是以'/'分隔的路径字符串。例如,模块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);
oyxsuwqo

oyxsuwqo2#

java.lang.module中的类更多的是模型世界。看看java.lang.module.Configurationjava.lang.ModuleLayer,看看如何创建一个配置,并在Java虚拟机中将其示例化为一个模块层。在ModuleLayer javadoc中有一个代码片段,可能会让你开始,只是要注意,这是一个高级主题,最好先掌握基础知识。
ModuleLayer中的示例(取自JDK 19):
此示例通过解析名为“myapp”的模块来创建配置,并将 Boot 层的配置作为父层。然后,它使用此配置中的模块创建新层。所有模块都定义到同一个类加载器。

ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3);
ModuleLayer parent = ModuleLayer.boot();
Configuration cf = parent.configuration()
                         .resolve(finder, ModuleFinder.of(), Set.of("myapp"));
ClassLoader scl = ClassLoader.getSystemClassLoader();
ModuleLayer layer = parent.defineModulesWithOneLoader(cf, scl);
Class<?> c = layer.findLoader("myapp").loadClass("app.Main");

相关问题