java - --patch-module 是否会反射性地显示出来?

标签 java java-module java-platform-module-system

假设使用--patch-module调用java。从正在运行的程序中,有没有一种方法可以发现修补的模块在多个位置包含类和包?我未能在 ModuleLayerModuleReference 等中找到任何合适的内容。 (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/

相关文章:

java - 无法解析配置 : hibernate. cfg.xml:元素类型 "session-factory"必须由匹配的结束标记 "</session-factory>"终止

java - 当您键入时从 jcombobox 获取文本

gradle - 如何将 --add-exports 添加到 gradle 应用程序?

java - 什么是非法反射访问?

Java Swing Invoice String.format 仅将 for () {} 值返回到 JTextPane?

java - Java 9 模块的目录布局

JavaFx:无法创建播放器

java-9 - 带有加密提供程序的签名模块化 JAR 无法链接到运行时镜像

java - 无法使字段最终 transient java.lang.Class java.util.EnumSet.elementType 可访问 : module java. 基不 "opens java.util"未命名

java - 应用程序随机轰炸,WebView 抛出空指针