25

私はJavaServiceLoaderを使用して、次のような特定のインターフェースを実装するすべてのクラスを見つけようとしまし

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はクラスを見つけられません。些細な点が欠けているような気がします...

4

3 に答える 3

36

ServiceLoaderそれはできません。

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

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

于 2012-04-24T18:54:12.430 に答える
25

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

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

}

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

}
于 2015-07-12T02:05:38.277 に答える
3

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

于 2016-08-17T13:34:09.257 に答える