したがって、私のアプリケーションには、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 とは関係のないインターフェイスを実装したクラスには問題がないようです。それぞれの jar ファイルを含むフォルダーからプラグインをロードします。
編集
META-INF/services には、テキスト plugin.Plugin を含む app.IModule ファイルしかありません。プラグイン クラスは、IModule を実装したクラスです。これは、サービス ローダーがロードするクラスであるため、私が宣言した唯一のサービスです。AbstractView を拡張するクラスも宣言する必要がありますか? サービスローダーに読み込まなくても