如何在运行时测试可选模块是否存在

How to test whether an optional module is present at runtime

Java 平台模块系统 (JPMS) 允许模块使用 module-info.java 文件中的 requires static 声明可选依赖项:

module my.module {
    requires static some.optional.module;
}

但是,您应该如何在代码中检查模块在运行时是否存在?

建议的 Project Jigsaw: Optional Modules 页面:

public boolean isModulePresent(String mn);

但是,它似乎被删除了,因为在最新的 Java 版本中没有这样的方法。我也找不到在当前 Java 版本中提到的 @RequireOptionalModule 注释。

This example on blog@CodeFX suggests a quite verbose method chain on StackWalker (which is explained here).
编辑:该示例试图找出模块是否可供调用者使用 class,这在我的情况下不是必需的。

是否有更简单的方法来执行此检查,或者如果某个 class 的存在表明存在模块,则简单的 Class.forName 检查是否足够?

要查明某个模块在运行时是否可用,您只需调用 ModuleLayer.findModule():

Optional<Module> module = ModuleLayer.boot().findModule("java.desktop");
System.out.println(module.isPresent());
如果您知道模块中某些特定 class 的名称,

Class.forName() 也应该有效。但是,如果未找到 class,forName() 将抛出 ClassNotFoundException。这意味着您必须用 try-catch 包围它才能使其工作。这不是很方便。