java - 如何在运行时测试可选模块是否存在
问题描述
Java 平台模块系统 (JPMS) 允许模块requires static
在module-info.java
文件中使用声明可选依赖项:
module my.module {
requires static some.optional.module;
}
但是,您应该如何在代码中检查该模块在运行时是否存在?
拼图项目:可选模块页面建议:
public boolean isModulePresent(String mn);
但是,它似乎被删除了,因为在最新的 Java 版本中没有这样的方法。我也找不到@RequireOptionalModule
当前 Java 版本中提到的注释。
blog@CodeFX 上的这个例子暗示了一个非常冗长的方法链(在此处StackWalker
进行了解释)。
编辑:该示例试图找出调用者类是否可以使用模块,这在我的情况下不是必需的。
有没有更简单的方法来执行这个检查,或者Class.forName
如果某个类的存在表明一个模块存在,一个简单的检查就足够了?
解决方案
要了解某个模块在运行时是否可用,您可以简单地调用ModuleLayer.findModule():
Optional<Module> module = ModuleLayer.boot().findModule("java.desktop");
System.out.println(module.isPresent());
Class.forName()
如果您知道模块中某些特定类的名称,也应该可以工作。但是,如果找不到类,则forName()
抛出。ClassNotFoundException
这意味着您必须将其包围try-catch
才能使其正常工作。这不是很方便。
推荐阅读
- aws-step-functions - 通过 Step Function 调用 lambda 函数时可以指定 lambda 别名吗?
- twilio - Twilio 支持文档中关于美国号码不能轻易识别为手机号码的声明是否不正确?
- python - 诗歌 + Cython + 测试(Nosetests)
- html - 不向嵌套 div-CSS 中的最后一个子元素添加 css 属性
- python - 在 Microsoft 认知面部 API 中创建人员组人员时出错
- jquery - 当我单击编辑时模态消失并且 id 也没有传递给控制器
- sql - 将SqlServer表数据加载到csv文件的Shell脚本
- c++ - 动态分配包含要动态分配的向量的向量
- python - 如何递归地创建元组列表?
- google-apps-script - 将 Google Apps 脚本项目切换到 V8 运行时时的范围问题