Назад к вопросам
Middle
11
// ... 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()); }
Компании, где спрашивали
ИП Ганус Александр Андреевич
Ответ от нейросети
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
}
Важно, чтобы у классов был публичный конструктор без параметров, иначе создание экземпляра вызовет исключение.