抽象クラスを実装するプラグインをロードできる Java アプリを作成しようとしていますが、ServiceLoader から生成されたインスタンスで AbstractMethodError が発生しています。コードは少し重いので、以下に簡略化しました。
まず、抽象クラスがあります。
package stuff.TheAbstractClass;
public abstract class TheAbstractClass implements ClassInterface{
//Stuff happens
}
以下のインターフェースを実装します。
package stuff.ClassInterface;
public interface ClassInterface {
public String getClassName();
}
meta-inf/services フォルダーにNotAbstractClass
拡張して記載するサービス プロバイダーがあります。TheAbstractClass
package anotherstuff.NotAbstractClass;
public final class NotAbstractClass extends TheAbstractClass implements ClassInterface{
private String name = "Silent Bob";
@Override
public String getClassName() { return name; }
}
次に、メイン アプリケーション (実際には別のアプリケーション内のプラグイン) で、拡張するすべてのクラスを見つけたいと思いますTheAbstractClass
。
package stuff.TheApp;
import java.util.ServiceLoader;
public class TheApp {
private String name;
public final static TheApp INSTANCE = new TheApp();
private TheApp() {
ServiceLoader<TheAbstractClass> serviceLoader =
ServiceLoader.load(TheAbstractClass.class);
for (TheAbstractClass class: serviceLoader) {
name = class.getClassName;
}
}
私のアプリケーションはNotAbstractClass
. forループでできるので、これを知ってclass.getName()
いますanotherstuff.NotAbstractClass
が、エラーが発生します:
java.lang.AbstractMethodError: stuff.TheAbstractClass.getClassName()Ljava/lang/String;
私は困惑しています。なにか提案を?ありがとう、ペドロ