Вопрос-ответ

Scanning Java annotations at runtime

Сканирование аннотаций Java во время выполнения

Как мне выполнить поиск аннотированного класса по всему пути к классу?

Я создаю библиотеку и хочу разрешить пользователям комментировать свои классы, поэтому при запуске веб-приложения мне нужно просканировать весь путь к классу на наличие определенных аннотаций.

Я думаю о чем-то вроде новой функциональности для веб-служб Java EE 5 или EJB. Вы комментируете свой класс с помощью @WebService или @EJB, и система находит эти классы во время загрузки, поэтому к ним можно получить удаленный доступ.

Переведено автоматически
Ответ 1

Используйте org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider

API


Поставщик компонентов, который сканирует путь к классу из базового пакета. Затем он применяет фильтры исключения и включения к полученным классам для поиска кандидатов.


ClassPathScanningCandidateComponentProvider scanner =
new ClassPathScanningCandidateComponentProvider(<DO_YOU_WANT_TO_USE_DEFALT_FILTER>);

scanner.addIncludeFilter(new AnnotationTypeFilter(<TYPE_YOUR_ANNOTATION_HERE>.class));

for (BeanDefinition bd : scanner.findCandidateComponents(<TYPE_YOUR_BASE_PACKAGE_HERE>))
System.out.println(bd.getBeanClassName());
Ответ 2

И еще одно решение - от ronmamo.

Краткий обзор:


  • Решение Spring - это правильный путь, если вы используете Spring. В противном случае это большая зависимость.

  • Прямое использование ASM немного громоздко.

  • Прямое использование Java Assist тоже является неуклюжим.

  • Annovention очень легкий и удобный. Интеграции с maven пока нет.

  • Reflections индексирует все, а затем выполняется очень быстро.

Ответ 3

Вы можете находить классы с любой заданной аннотацией с помощью ClassGraph, а также выполнять поиск по другим представляющим интерес критериям, например, по классам, реализующим данный интерфейс. (Отказ от ответственности, я являюсь автором ClassGraph .) ClassGraph может создавать абстрактное представление всего графа классов (все классы, аннотации, методы, параметры метода и поля) в памяти для всех классов в пути к классам или для классов в пакетах, внесенных в белый список, и вы можете запрашивать этот граф классов по своему усмотрению. ClassGraph поддерживает больше механизмов спецификации путей к классам и загрузчиков классов, чем любой другой сканер, а также отлично работает с новой модульной системой JPMS, поэтому, если вы основываете свой код на ClassGraph, ваш код будет максимально переносимым. Ознакомьтесь с API здесь.

Ответ 4

Если вам нужно действительно легкое решение (без зависимостей, простой API, файл jar размером 15 КБ) и очень быстрое, взгляните на annotation-detector найденное по адресу https://github.com/rmuller/infomas-asl

Отказ от ответственности: я автор.

2023-10-17 15:07 java