我目前正在编写一个需要在不同类型的设备上运行的应用程序。我的方法是制作一个“模块化”应用程序,可以根据需要操作的设备动态加载不同的类。
为了使应用程序易于扩展,我的目标是为附加模块(.jar 或 .class 文件)分配特定路径,而核心程序保持原样。当不同的客户需要不同的模块时(无需为每个客户编译不同的应用程序),这一点至关重要。
这些模块将实现一个公共接口,而“核心”应用程序可以使用接口上定义的这些方法,并让单个实现完成工作。按需加载它们的最佳方式是什么?我正在考虑使用 URLClassLoader,但我不知道这种方法是否根据新模式和 Java 趋势是最新的,因为我想避免设计不当的应用程序和不推荐使用的技术。使用 JDK 9 制作模块化且易于扩展的应用程序的替代最佳方法是什么(只需将模块文件添加到文件夹即可扩展)?
除了 @SeverityOne 给出的 ServicerLoader 用法之外,您还可以使用 module-info.java 使用“uses”/“provides”关键字来声明接口的不同实例。
然后你使用模块路径而不是类路径,它会加载包含模块的所有目录,不需要创建特定的类加载器
serviceLoader 的用法:
public static void main(String[] args) {
ServiceLoader<IGreeting> sl = ServiceLoader.load(IGreeting.class);
IGreeting greeting = sl.findFirst().orElseThrow(NullPointerException::new);
System.out.println( greeting.regular("world"));
}
在用户项目中:
module pl.tfij.java9modules.app {
exports pl.tfij.java9modules.app;
uses pl.tfij.java9modules.app.IGreeting;
}
在提供者项目中:
module pl.tfij.java9modules.greetings {
requires pl.tfij.java9modules.app;
provides pl.tfij.java9modules.app.IGreeting
with pl.tfij.java9modules.greetings.Greeting;
}
最后是 CLI 用法
java --module-path mods --module pl.tfij.java9modules.app
这是一个例子;GitHub 示例 https://github.com/pdemanget/Java-9-modules---the-simplest-example(感谢“tfij/”存储库初始示例)
编辑,我意识到存储库已经提供了解耦示例:https://github.com/tfij/Java-9-modules---reducing-coupling-of-modules https://github.com/tfij/Java-9-modules---reducing-coupling-of-modules
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)