提问者:小点点

如何从Java 9+目录中动态加载模块


我一直在做一个基于插件的系统的软件,用户可以编写自己的插件。 我对JMPS非常陌生,但我希望使用JMPS而不是OSGi来实现这一点。 制作了一个单独的API模块,甚至创建了一个测试插件。

插件以文件名“someplugin.jar”存储在一个目录中。

我如何在运行时加载所有这些JAR(它们都不是automodules,而是带有module-info.class的定义良好的模块)? 我想在运行时动态加载它们的原因是,用户将有一个选项来更改目录以搜索插件,并且更改它而不必重新启动应用程序。


共1个答案

匿名用户

您需要设置自己的类加载器,并根据类的URI(f.e.)加载它们。 例如:

URLClassLoader customClassLoader= URLClassLoader.newInstance
                                  (
                                    new URL[]{(Paths.get("/your/path/to/classes").
                                    toAbsolutePath().toUri().toURL())}
                                  );
Class<?> customClass= Class.forName(yourClassName, true, customClassLoader);

然后,您需要使用反射来获取类所需的构造函数。 假设您的构造函数接受两个整数参数。 调用它看起来像是:

Constructor<?> rflConstructor = customClass.getConstructor(Integer.class,Integer.class);

如果要从加载的类创建新实例,请对其调用newInstance:

  YourCustomClassInstance instance = rflConstructor.newInstance(1,2);

您可能需要从最后一个函数强制转换newInstance,但或多或少,这就是您所需要的。