Сканирование аннотаций Java в runtime: автопоиск классов
Быстрый ответ
В Java для изучения аннотаций применяйте Reflection API. Для доступа к метаданным класса используйте getDeclaredMethods(). isAnnotationPresent() позволит проверить наличие аннотации, а getAnnotation() — получить подробную информацию. Вот пример кода, демонстрирующего это:
public void scanAnnotations(Class<?> clazz) {
    for (Method m : clazz.getDeclaredMethods()) {
        if (m.isAnnotationPresent(YourAnnotation.class)) {
            // Аннотация обнаружена, теперь с ней можно работать
            // В качестве примера m.getAnnotation(YourAnnotation.class) вернёт необходимые данные
        }
    }
}
Подставьте вместо YourAnnotation название интересующей вас аннотации и передайте класс в метод scanAnnotations для сканирования.

Меч и щит: Reflection и специализированные библиотеки
Reflection — это мощный и гибкий инструмент, однако его использование может быть не всегда удобно, особенно при обработке большого числа классов или целого проекта. В решении этой проблемы помогают специализированные библиотеки и фреймворки.
Любимец сообщества: сканирование с помощью ClassPathScanningCandidateComponentProvider из Spring
Фреймворк Spring предлагает инструмент ClassPathScanningCandidateComponentProvider, который обеспечивает автоматическое сканирование и предоставляет фильтры для поиска аннотаций.
ClassPathScanningCandidateComponentProvider scanner =
    new ClassPathScanningCandidateComponentProvider(false);
scanner.addIncludeFilter(new AnnotationTypeFilter(YourAnnotation.class));
for (BeanDefinition bd : scanner.findCandidateComponents("your.base.package")) {
    System.out.println(bd.getBeanClassName());
}
Скрипт находит все классы в указанном пакете, помеченные аннотацией YourAnnotation.
Расширение твоего арсенала: ClassGraph и другие
ClassGraph — это надёжное средство поиска аннотаций, которое подойдет для работы в сложных средах. Он поддерживает различные загрузчики классов и модули JPMS.
try (ScanResult scanResult =
     new ClassGraph().enableAllInfo().whitelistPackages("your.base.package").scan()) {
    for (ClassInfo classInfo : scanResult.getClassesWithAnnotation(YourAnnotation.class.getName())) {
        System.out.println(classInfo.getName());
    }
}
Annovention подойдет для лёгких решений, а в Java EE 5 аннотированные классы обнаруживаются автоматически без дополнительных настроек.
Сценарии использования: применение инструментов
Максимальная отдача от Spring
В Spring сканирование аннотаций делает код аккуратней и облегчает его поддержку. Таблица ниже сравнивает удобство использования Spring и чистого Reflection API:
| Метод | Удобство использования | 
|---|---|
| Java Reflection | Вручную | 
| Spring Framework | Автоматизированно | 
Применение ClassGraph для сложных кейсов
ClassGraph благодаря своей гибкости обеспечивает эффективную работу с аннотациями в различных средах разработки и запуска приложений.
Отдаем предпочтение Java reflection для простоты
Java reflection — это оптимальный выбор для простых задач и ситуаций, когда максимально важно избегать сторонних зависимостей.
Визуализация
Наглядно процесс сканирования аннотаций в Java можно представить как процесс открытия коробок:
Замок Java-классов 🏰
============================
| Коробка (Класс)         | Сокровище (Аннотация) Найдено |
|-------------------------|-------------------------------|
| Коробка А               | 💎 Да                        |
| Коробка Б               | ❌ Нет                       |
| Коробка В               | 💎 Да                        |
| Коробка Г               | 💎 Да                        |
for (Box box : JavaClassLand) {
    if (box.hasTreasure()) {
        revealTreasure(box); // Раскрываем сокровище – аннотацию
    }
}
Такое представление сканирования аннотаций в Java помогает лучше понять его преимущества и возможности.
Полезные материалы
- GitHub – ronmamo/reflections: Java runtime metadata analysis — упрощённый процесс сканирования аннотаций.
 - Trail: The Reflection API (The Java™ Tutorials) — подробное описание Reflection API.
 - java – Can you find all classes in a package using reflection? – Stack Overflow — практические примеры поиска классов с аннотациями.
 - Javassist by jboss-javassist — руководство по использованию Javassist для сканирования аннотаций.
 - java – Why doesn't a missing annotation cause a ClassNotFoundException at runtime? – Stack Overflow — обсуждение эффективности использования аннотаций в Java.
 


