在 Java 中动态加载模块(类)的最佳方法

2024-03-16

我目前正在编写一个需要在不同类型的设备上运行的应用程序。我的方法是制作一个“模块化”应用程序,可以根据需要操作的设备动态加载不同的类。

为了使应用程序易于扩展,我的目标是为附加模块(.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(使用前将#替换为@)

在 Java 中动态加载模块(类)的最佳方法 的相关文章

随机推荐