Подтвердить что ты не робот

Как создать список классов, аннотированных с помощью моей аннотации?

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

пс. Например, как реализации JAX-RS находят все классы, аннотированные с помощью @Path? Я хотел бы использовать тот же механизм.

4b9b3361

Ответ 1

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

Этот подход реализуется такими библиотеками, как Scannotation и Reflections.

Другим подходом является использование Java Pluggable API обработки аннотации для записи обработчика аннотаций, который будет собирать все аннотированные классы во время компиляции и строить индексный файл для использования во время выполнения.

Вышеупомянутый механизм реализован в библиотеке ClassIndex.

Использование сканирования пути к классам обычно на два порядка медленнее, чем индексирование во время компиляции. См. этот тест.

Ответ 2

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

Google Guava имеет ClassPath объект, который обеспечивает "наилучшее усилие" сканирование классов (на самом деле это все любые утилиты сканирования классов). Поскольку Guava является широко принятой, тщательно укомплектованной библиотекой утилиты, это отличный вариант для проектов, которые либо (а) уже используют Guava, либо (b) нуждаются в стабильной библиотеке, на которую они могут положиться для сканирования пути к классам.

Ответ 3

Вы должны взглянуть на Scannotation.

Ответ 4

Вы можете попробовать мою библиотеку FastClasspathScanner:

List<String> classNames = new FastClassPathScanner("com.mypackage")
    .scan()
    .getNamesOfClassesWithAnnotation(Custom.class);

Ответ 5

Как вы, наверное, уже знаете, Java не имеет возможности перечислять все пакеты или классы в каждом пакете. Поэтому вы должны сделать это "жестким" способом. Параметры:

  • Используйте инструмент, например grep, для поиска аннотации. Преимущество: быстрая, простая. Недостатки: можно вернуть ложные срабатывания (например, классы, в которых комментарий комментируется).

  • Скомпилируйте код и обработайте результат с помощью javap. Это работает на уровне байт-кода [*]. Он дает точные результаты, но вывод javap не предназначен для автоматической обработки.

  • Используйте библиотеку байт-кода, например ASM. Не для слабонервных, но он также позволяет вам обращаться к другим данным (например, реализованным интерфейсам, полям и т.д.) В отношении аннотации.

  • Последний параметр: Eclipse использует свой собственный Java-компилятор, который может построить код AST из Java (даже если код не компилируется). Преимущество над ASM: вы бесплатно получаете модель для Java-кода. Делает определенные операции более простыми. Но так легко настроить. См. мой блог для примера.

[*]: для этой работы аннотация должна иметь Retention.RUNTIME.

Ответ 6

classindex - это библиотека сканирования аннотаций времени компиляции, реализованная с использованием процессора аннотаций.

Ответ 7

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

Ответ 8

Самый простой способ - использовать IDE как предложил Иисус.

Но вы также можете

Остерегайтесь: все это сложно. Решение AspectJ должно быть самым простым.