Поиск подклассов и реализаторов интерфейсов в Java
Быстрый ответ
Для поиска подклассов в Java вам пригодится библиотека Reflections. Добавьте её в свой проект и примените следующий код:
Reflections reflections = new Reflections("my.package");
Set<Class<? extends BaseClass>> subclasses = reflections.getSubTypesOf(BaseClass.class);
Не забудьте заменить my.package
и BaseClass
на названия вашего пакета и класса соответственно. Данный код вернёт набор подклассов BaseClass
из указанного пакета.
Несмотря на эффективность библиотеки Reflections, для некоторых задач могут быть более уместны другие методы, которые учитывают производительность в масштабных проектах.
Расширенные техники поиска подклассов
Использование возможностей Spring для выявления подклассов
В приложениях, основанных на Spring, для определения подклассов конкретного класса можно применить возможности самого фреймворка:
ClassPathScanningCandidateComponentProvider provider =
new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AssignableTypeFilter(BaseClass.class));
for (BeanDefinition beanDef : provider.findCandidateComponents("my.package")) {
System.out.println(beanDef.getBeanClassName());
}
Такой подход помогает уменьшить потребление памяти и повысить производительность, что весьма актуально для масштабных приложений.
Иерархия типов в Eclipse для быстрого ориентирования
Пользователям Eclipse удобно будет использовать функционал иерархии типов:
- Откройте класс в редакторе.
- Нажмите
Ctrl + T
(Windows/Linux) или⌘ + T
(macOS) для отображения иерархии. - Ознакомьтесь со списком подклассов.
Данный метод предоставляет быстрый способ получения информации, хотя его применение ограничено рамками вашей среды разработки и не применимо в коде.
Сканирование с ClassGraph: универсальное решение
ClassGraph — универсальное решение, функциональное в любой среде, включая Java Platform Module System (JPMS):
try (ScanResult scanResult =
new ClassGraph().enableClassInfo().whitelistPackages("com.my.package").scan()) {
ClassInfoList subclasses = scanResult.getSubclasses("com.my.package.BaseClass");
subclasses.forEach(classInfo -> System.out.println(classInfo.getName()));
}
ClassGraph способен сканировать classpath, модули и JAR-ресурсы на лету.
Javadoc: Надёжная старая документация
Javadoc может незамедлительно предоставить информацию о всех известных подклассах базового класса, функционируя как надёжный статический справочник.
Оптимизация поиска подклассов
Изучение отношений между рефлексией и производительностью
Рефлексивные технологии, такие как Reflections и ClassGraph, требуют оценки с точки зрения производительности. Обязательно проведите тестирование производительности в контексте вашего приложения для обеспечения оптимальной работы.
Мониторинг класспаса
В системах, где важен постоянный контроль за класспасом, можно использовать наблюдатели файловой системы или уведомления ОС.
Выбор инструмента: решайте обдуманно
Выбирая инструмент, уделяйте внимание тому, как он взаимодействует с системой загрузки классов, каким образом потребляет память и как быстро работает, чтобы соответствовать требованиям вашего проекта.
Визуализация
Представьте себе ряд домино, где каждая фишка символизирует класс, а цепная реакция, запускаемая после опрокидывания первой, представляет подклассы:
Ряд домино: [BaseClass🔵, SubClass1🔴, SubClass2🟡, SubClass3🟢]
Поиск подклассов — это как опрокидывание первой фишки (BaseClass🔵) и наблюдение за возникающей реакцией:
Упавшие фишки: [🔴, 🟡, 🟢]
В Java для "запуска эффекта домино" мы используем Reflection API!
Полезные материалы
- GitHub – ronmamo/reflections: Анализ метаданных времени выполнения Java — мощная библиотека для выявления подклассов.
- GitHub – classgraph/classgraph: Ультра-быстрый сканер класспаса Java — осуществляет мгновенное сканирование классов и модулей Java.
- Class (Java Platform SE 8 ) — официальная документация Java по объектам
Class
. - Как найти все подклассы определённого класса в Java? – Stack Overflow — различные решения и примеры для поиска подклассов в Java.
- Тропа: Reflection API (Java Tutorial) — подробное руководство по Reflection API Java.
- java – Можно ли отыскать все классы в пакете с использованием рефлексии? – Stack Overflow — дискуссия о поиске классов в пакете на Stack Overflow.