web-dev-qa-db-ja.com

インターフェースの実装を見つけるServiceLoader

Java ServiceLoader を使用して、次のように特定のインターフェースを実装するすべてのクラスを見つけようとしました:

loader = ServiceLoader.load(Operation.class);
try {
    for (Operation o : loader) {
        operations.add(o);
    }
} catch (ServiceConfigurationError e) {
    LOGGER.log(Level.SEVERE, "Uncaught exception", e);
}

残念ながら、Eclipseをデバッグモードで実行すると、ServiceLoaderでクラスが見つかりません。ささいなポイントを逃しているような気がします...

24
Caroline

ServiceLoaderはそれを行うことができません。

ServiceLoaderで検出できるサービスとしてクラスを公開するには、 Javaプラットフォームを使用した拡張可能なアプリケーションの作成 で説明されているように、その名前をプロバイダー設定ファイルに入れる必要があります。 =。

特定のインターフェースを実装するすべてのクラスを見つける組み込みの方法はありません。同様のことを実行できるフレームワークは、独自のクラスパススキャンソリューションを使用します(.classファイルは、推移的にではなく、直接実装されたインターフェイスに関する情報のみを格納するため、カスタムクラスパススキャンを使用しても簡単ではありません)。

33
axtavt

実装が自分で作成したものである場合は、 AutoService を使用して、ServiceLoaderインターフェースから使用できるようにすることができます。たとえば、

@AutoService(Operation.class)
class Foo implements FooInterface {

}

@AutoService(Operation.class)
class Bar extends Foo {

}
24
Xiao

実行時にクラスパスをスキャンして特定のインターフェースの実装を探すには、別のソリューションを使用する必要があります。 Reflections (最後に通知s、これはJavaのReflection APIではありません)

3
Antoniossss