我正在开发一个连接到相同类型的不同设备的项目。我已经为单个设备实现了一些类,但现在开发了一个所有“驱动程序”都应该实现的通用接口。
我现在的问题是:稍后,用户应该通过 GUI 使用我的程序,并且应该能够“加载”我提供的驱动程序。但是这些驱动程序看起来如何?带有实现驱动程序接口的类的 .jar?一个大致描述要做什么的 xml 文件?
您可以考虑以下帖子作为起点:https ://stackoverflow.com/a/2575156/471129
基本上,依赖注入和控制反转用于从外部指定配置并经常从不同的 .jar 文件动态加载代码,这似乎是您想要做的。
当然,您总是可以通过类名加载代码,如下所示:
public interface IPlugin {
// some methods that all the plugins will have in common
}
private static IPlugin loadIPluginByClassName(String plugInClassName, ClassLoader classLoader) {
// NOTE: throws NoClassDefFoundError or ClassNotFoundException if cannot load the class
// or throws ClassCastException if the loaded class does not implement the interface
Class<?> cls = classLoader.loadClass(plugInClassName);
IPlugin ans = (IPlugin) cls.newInstance()
return ans;
}
您需要使用包限定的类名和类加载器调用 loadIPluginByClassName(),如
IPlugin pi = loadIPluginByClassName("com.test.something.MyPlugin", SomeClassInYourProject.class.getClassLoader());
只要 .jar 在类路径中,插件就可以在它自己的 .jar 中。
如果您不想从外部 .jar 加载它们,可以使用更简单的
IPlugin pi = loadIPluginByClassName(MyPlugin.class.getName(), SomeClassInYourProject.class.getClassLoader());
这将创建对您的插件类的直接引用(这可能会有所帮助,因为可以将其作为参考)