使用代码:
ModuleFinder.of(Paths.get(path)).findAll()
我能够在
Set<ModuleReference>
文件夹中检索所有.jars的path
。
我的下一步是从
Module
得到一个
ModuleReference
但没有方法返回它,我可以得到一个 ModuleDescriptor
但即使那个也无济于事。有没有办法做到这一点?
open
您已经获得的ModuleReference
。
这将使您能够访问 ModuleReader
which
适用于访问模块中的资源的情况 必填
模块中的资源由抽象名称标识,该抽象名称是
分隔的路径字符串。例如,模块'/'
可能有资源java.base
,按照惯例, 是"java/lang/Object.class"
的类文件。模块阅读器可以处理 模块内容中的目录作为资源(无论是否 模块阅读器特定)。模块内容包含目录的位置 可以定位为资源,然后其名称以斜杠 (java.lang.Object
) 结尾。该目录也可以使用删除尾部斜杠的名称来定位。'/'
请记住,文档还指定:
方法。未能关闭模块阅读器可能会导致资源 泄露。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);
java.lang.module 中的类更多的是模型世界。查看
java.lang.module.Configuration
和 java.lang.ModuleLayer
以了解如何创建配置并将其作为模块层在 Java 虚拟机中实例化。 ModuleLayer
javadoc 中有一个代码片段可能会让您继续前进,请注意这是一个高级主题,最好先掌握基础知识。