首页 > 解决方案 > 如何在运行时测试可选模块是否存在

问题描述

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

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

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

拼图项目:可选模块页面建议:

public boolean isModulePresent(String mn);

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

blog@CodeFX 上的这个例子暗示了一个非常冗长的方法链(在此处StackWalker进行了解释)。 编辑:该示例试图找出调用者类是否可以使用模块,这在我的情况下不是必需的。

有没有更简单的方法来执行这个检查,或者Class.forName如果某个类的存在表明一个模块存在,一个简单的检查就足够了?

标签: javajava-modulejava-platform-module-system

解决方案


要了解某个模块在运行时是否可用,您可以简单地调用ModuleLayer.findModule()

Optional<Module> module = ModuleLayer.boot().findModule("java.desktop");
System.out.println(module.isPresent());

Class.forName()如果您知道模块中某些特定类的名称,也应该可以工作。但是,如果找不到类,则forName()抛出。ClassNotFoundException这意味着您必须将其包围try-catch才能使其正常工作。这不是很方便。


推荐阅读