Подтвердить что ты не робот

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 не находит никаких классов. Я чувствую, что мне не хватает тривиальной точки...

4b9b3361

Ответ 1

ServiceLoader не может этого сделать.

Чтобы открыть класс как услугу, которую можно обнаружить с помощью ServiceLoader, вам нужно поместить его имя в файл конфигурации поставщика, как описано в Создание расширяемых приложений с помощью платформы Java.

Нет встроенных способов поиска всех классов, реализующих определенный интерфейс. Рамки, которые могут что-то сделать, используют свои собственные решения для сканирования классов (и даже с помощью настраиваемого сканирования классов не так просто, потому что файлы .class хранят только информацию о интерфейсах, реализованных напрямую, а не транзитивно).

Ответ 2

Если реализации - это те, которые вы написали сами, вы можете использовать AutoService, чтобы сделать их доступными через интерфейс ServiceLoader, например

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

}

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

}

Ответ 3

Чтобы сканировать ваш путь к классам во время выполнения для реализации конкретного интерфейса, вам нужно будет использовать другое решение, например. Reflections (обратите внимание на s в конце, это не API Java Reflection API)