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でクラスが見つかりません。ささいなポイントを逃しているような気がします...
ServiceLoader
はそれを行うことができません。
ServiceLoader
で検出できるサービスとしてクラスを公開するには、 Javaプラットフォームを使用した拡張可能なアプリケーションの作成 で説明されているように、その名前をプロバイダー設定ファイルに入れる必要があります。 =。
特定のインターフェースを実装するすべてのクラスを見つける組み込みの方法はありません。同様のことを実行できるフレームワークは、独自のクラスパススキャンソリューションを使用します(.class
ファイルは、推移的にではなく、直接実装されたインターフェイスに関する情報のみを格納するため、カスタムクラスパススキャンを使用しても簡単ではありません)。
実装が自分で作成したものである場合は、 AutoService を使用して、ServiceLoader
インターフェースから使用できるようにすることができます。たとえば、
@AutoService(Operation.class)
class Foo implements FooInterface {
}
@AutoService(Operation.class)
class Bar extends Foo {
}
実行時にクラスパスをスキャンして特定のインターフェースの実装を探すには、別のソリューションを使用する必要があります。 Reflections (最後に通知s、これはJavaのReflection APIではありません)