假设使用--patch-module
调用java
。从正在运行的程序中,有没有一种方法可以发现修补的模块在多个位置包含类和包?我未能在 ModuleLayer
、ModuleReference
等中找到任何合适的内容。 (jdk.module.path
系统属性显然也不包含任何有用的信息,并且除了sun.java.command
之外,没有其他看起来有前途的系统属性,这看起来我确实不应该依赖它。)
最佳答案
模块修补不是 Java 规范的一部分。它是 JDK 特定的机制。因此,它不会直接在模块反射 API 中公开。
有一种方法可以检测已修补的模块。这有点复杂,但似乎有效:
public static boolean isPatched(Module mod) throws IOException {
ModuleReader reader = mod.getLayer()
.configuration().findModule(mod.getName()).orElseThrow()
.reference()
.open();
String modInfoName = "module-info.class";
URI modInfo = reader.find(modInfoName).orElseThrow();
String modInfoStr = modInfo.toString();
String root = modInfoStr.substring(0, modInfoStr.length() - modInfoName.length());
List<String> resources;
try (Stream<String> stream = reader.list()) {
resources = stream.toList();
}
for (String res : resources) {
URI uri = reader.find(res).orElseThrow();
if (!uri.toString().contains(root)) {
return true;
}
}
return false;
}
这依赖于 module-info.class
无法修补的事实,因此应始终在模块的“根”位置中找到它。
找到 module-info.class 资源的 URI 后,我们可以查看所有其他资源,看看它们是否是从同一根路径读取的。如果没有,这意味着该模块已被修补。
(该示例做了一些 WRT 错误处理,但希望您能明白)。
关于java - --patch-module 是否会反射性地显示出来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76640372/