web-dev-qa-db-fra.com

ServiceLoader pour trouver des implémentations d'une interface

J'ai essayé d'utiliser Java serviceLoader pour trouver toutes les classes qui implémentent une interface spécifique comme suit:

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

Malheureusement, lorsque j'exécute Eclipse en mode de débogage, le serveurLoader ne trouve aucune classe. J'ai envie de manquer un point trivial ...

24
Caroline

ServiceLoader ne peut pas le faire.

Afin d'exposer la classe en tant que service pouvant être découvert par ServiceLoader, vous devez mettre son nom dans un fichier de configuration du fournisseur, comme décrit dans Création d'applications extensibles avec la plate-forme Java =.

Il n'y a pas de méthodes intégrées à trouver toutes les classes qui implémentent une interface particulière. Les cadres qui peuvent faire quelque chose de similaire utilisent leurs propres solutions de numérisation de classe de classe (et même avec la numérisation de classe de classe personnalisée, il n'est pas facile, car .class Les fichiers stockent uniquement des informations sur les interfaces implémentées directement, non transitivement).

33
axtavt

Si les implémentations sont celles que vous avez écrites vous-même, vous pouvez utiliser autoservice pour les rendre disponibles via l'interface ServiceLoader, par exemple

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

}

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

}
24
Xiao

Afin de numériser votre parcours de classe au moment de la mise en œuvre d'une interface spécifique, vous devez utiliser une solution différente, par exemple. Réflexions (Avis S À la fin, ce n'est pas l'API de réflexion de Java)

3
Antoniossss