我想做一个服务,它运行 24/7 并且可以加载新模块或已加载模块的更新版本而无需重新启动它。
我可以从 jar 文件中加载类,如下所示:
@FunctionalInterface
public interface IWorker {
void doStuff();
}
IWorker worker;
try {
URL[] urls = { new URL("jar:file:" + "C:\\Users\\...\\out\\artifacts\\workers_jar\\somethingworker.jar" +"!/") };
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("hu.test.worker.SomethingWorker");
worker = (IWorker) cls.newInstance();
worker.doStuff();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
该软件已经使用数据库表对从模块加载的类进行一些配置,因此如果我将完整的类名存储在那里(可能还有 jar 的路径),我可以使用它。我的问题是,我可以这样做更好吗?这有点难以维护并且很容易破坏,我也不知道我是否可以用它加载已经加载的类。