我一直在做一个基于插件的系统的软件,用户可以编写自己的插件。 我对JMPS非常陌生,但我希望使用JMPS而不是OSGi来实现这一点。 制作了一个单独的API模块,甚至创建了一个测试插件。
插件以文件名“someplugin.jar”存储在一个目录中。
我如何在运行时加载所有这些JAR(它们都不是automodules,而是带有module-info.class的定义良好的模块)? 我想在运行时动态加载它们的原因是,用户将有一个选项来更改目录以搜索插件,并且更改它而不必重新启动应用程序。
您需要设置自己的类加载器
,并根据类的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,但或多或少,这就是您所需要的。