Sobes.tech
Back to questions
Middle
10

// ... some code here? private static List<DocumentProvider> getDocumentProviders() { Reflections reflections = new Reflections(Main.class.getProtectionDomain().getCodeSource().getLocation()); Set<Class<?>> subTypes = reflections.get(SubTypes.of(DocumentProvider.class).asClass()); return subTypes.stream().map(subType -> { try { return (DocumentProvider) subType.getConstructor().newInstance(); } catch (Exception ex) { throw new RuntimeException(ex); } }).collect(Collectors.toList()); }

Companies where asked
ИП Ганус Александр Андреевич

Answer from AI

sobes.tech AI

В данном коде используется библиотека Reflections для динамического поиска всех классов, которые являются подклассами или реализуют интерфейс DocumentProvider.

Основные шаги:

  • Создаётся объект Reflections, инициализированный путем получения локации текущего класса Main.
  • С помощью метода get(SubTypes.of(DocumentProvider.class).asClass()) получаем множество всех классов, реализующих DocumentProvider.
  • Для каждого такого класса создаётся новый экземпляр через рефлексию (конструктор без параметров).
  • Все экземпляры собираются в список и возвращаются.

Таким образом, этот метод позволяет динамически получить список всех доступных реализаций DocumentProvider без явного перечисления классов.

Пример использования Reflections:

Reflections reflections = new Reflections("com.example.providers");
Set<Class<? extends DocumentProvider>> providers = reflections.getSubTypesOf(DocumentProvider.class);
for (Class<? extends DocumentProvider> providerClass : providers) {
    DocumentProvider provider = providerClass.getDeclaredConstructor().newInstance();
    // использовать provider
}

Важно, чтобы у классов был публичный конструктор без параметров, иначе создание экземпляра вызовет исключение.