2012-04-24 6 views
20

Próbowałem użyć Java ServiceLoader znaleźć wszystkie klasy, które implementują określonego interfejsu tak:ServiceLoader znaleźć implementacje interfejsu

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

Niestety, gdy uruchamiam Eclipse w trybie debugowania ServiceLoader nie znajdź dowolne zajęcia. Czuję się jakbym brakuje trywialny punkt ...

+6

Czy skonfigurowałeś 'META-INF/services/fqcn.Operation'? – nobeh

Odpowiedz

25

ServiceLoader nie mogę tego zrobić.

Aby ujawnić klasę jako usługę, która może zostać wykryta przez ServiceLoader, należy umieścić jej nazwę w pliku konfiguracyjnym dostawcy, jak opisano w Creating Extensible Applications With the Java Platform .

Nie ma wbudowanych metod wyszukiwania wszystkich klas implementujących dany interfejs. Ramy, które mogą zrobić coś podobnego, wykorzystują własne rozwiązania do skanowania typu classpath (a nawet z niestandardowym skanowaniem ścieżki klasy nie jest to łatwe, ponieważ pliki .class przechowują tylko informacje o interfejsach zaimplementowanych bezpośrednio, a nie przechodnie).

18

Jeśli implementacje są te, które sam napisałeś, można użyć AutoService udostępniać je za pośrednictwem interfejsu ServiceLoader np

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

} 

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

} 
+2

Dziękuję bardzo za tę sugestię! Po prostu nie mogłem uruchomić pliku dostawcy. Musiałeś umieścić go w niewłaściwym miejscu lub z literówką lub czymś, ale to działało zaraz po wyjęciu z pudełka z mavenem. można znaleźć najnowszą wersję w repozytorium maven w http://mvnrepository.com/artifact/com.google.auto.service/auto-service –

+0

moja przyjemność! Jeśli masz ulepszenia, edytuj odpowiedź dla widzów z przyszłości (w przyszłości). – Xiao

+0

Ta usługa AutoService jest genialna! – Frankie

0

W celu skanowania ścieżki klasy w czasie wykonywania do implementacji konkretnego interfejsu byś trzeba użyć innego rozwiązania, np. Reflections (zawiadomienie s na końcu, to nie jest odbicie w Java API)