0

抽象クラスを実装するプラグインをロードできる 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;

私は困惑しています。なにか提案を?ありがとう、ペドロ

4

2 に答える 2

0

AbstractMethodErrorの API によると、次のようになります。

アプリケーションが抽象メソッドを呼び出そうとするとスローされます。通常、このエラーはコンパイラによってキャッチされます。このエラーは、現在実行中のメソッドが最後にコンパイルされてから一部のクラスの定義が非互換に変更された場合にのみ、実行時に発生する可能性があります。

コードとコメントを見るだけで、これは実行時にのみ発生した可能性があることがわかります。

その場合は、次のようになります。

現在実行中のメソッドが最後にコンパイルされてから、一部のクラスが非互換に変更されました

Java 互換フォームでいくつかの調整を行った後、ロジックをテストしましたが、問題はありませんでした。起こっているように見える唯一のことは、 のサブクラスの変更ですTheAbstractClass

私が行ったもう 1 つのことは、次の依存関係ファイルを使用して依存関係を宣言することでした: resources/META-INF/services:

ファイル: <フルパッケージ>.TheAbstractClass

content : <フルパッケージ>.NotAbstractClass

この後、問題はありませんでした。

于 2016-05-15T22:27:58.297 に答える
0

問題はコードではなく、IDE (IntelliJ) にあったようです。以前にパッケージ化されたすべての jar を削除し、何も変更せずに新しい jar を作成したところ、魔法のように機能しました...したがって、これは IDE のバグであり、言語の問題ではありません! ただし、時間を割いて読んでくれた @Joao と @hotzst に感謝します。ベスト、ペドロ

于 2016-05-16T10:48:56.320 に答える