所以我的应用程序有一个主项目,它加载所有实现 IModule 的类。每个模块都有一个扩展 AbstractView 的视图。这是示例代码
public abstract class AbstractView extends JPanel{
//Init panel
}
public Module implements IModule{
public AbstractView getView(){
return some class that extends AbstractView;
}
public String getModuleName(){
return "ModuleName";
}
}
public Application{
ServiceLoader<IModules> modules; //Loaded at start of application
public void displayModule(String moduleName){
Iterator<IModule> moduleIterator = modules.iterator();
while (moduleIterator.hasNext()) {
if (module.getModuleName() == moduleName) {
display(module.getView());
}
}
public void display(AbstractView view){
displayPanel.add(view, Borderlayout.Center);
displayPanel.repaint();
}
}
它只是简化的示例,但这几乎就是它的工作原理。我的问题是我无法显示插件视图。我不知道为什么这不起作用。当我打印加载的视图时,我得到了扩展该 AbstractView 的类,其属性如布局类型等。实现与 UI 无关的接口的类似乎没有问题 atm。我从包含它们各自的 jar 文件的文件夹中加载插件。
编辑
在我的 META-INF/services 中,我只有 app.IModule 文件,其中包含文本 plugin.Plugin。插件类是实现 IModule 的类。这是我声明的唯一服务,因为它是服务加载器将加载的类。我是否也必须声明扩展 AbstractView 的类?即使没有在服务加载器中加载它