В Java 8 (выпущен в марте 2014 года) можно писать повторяющиеся / дублированные аннотации. См. [D0] http://docs.oracle.com/javase/tutorial/java/annotations/repeating.html .
Как вы, наверное, уже знаете, Java не имеет возможности перечислять все пакеты или классы в каждом пакете. Поэтому вы должны сделать это «жестким» способом. Опции:
grep
, для поиска аннотации. Преимущество: быстрая, простая. Недостатки: можно вернуть ложные срабатывания (например, классы, в которых комментируется аннотация). javap
. Это работает на уровне байт-кода [*]. Он дает точные результаты, но вывод javap
на самом деле не предназначен для автоматической обработки. [*]: аннотация должна иметь Retention.RUNTIME
для этого.
Самый простой способ - использовать IDE , как предложил Иисус .
Но вы также можете
Остерегайтесь: все это сложно. Решение AspectJ должно быть самым простым.
Запустите поиск в вашей среде IDE в источнике. Если вы попытаетесь сделать это на скомпилированных классах, вы бы добавили к ним метод, чтобы поддержать это, даже если вы декомпилировали классы, которые я не думаю, что появятся аннотации или комментарии .
Вы можете попробовать мою библиотеку FastClasspathScanner :
List<String> classNames = new FastClassPathScanner("com.mypackage")
.scan()
.getNamesOfClassesWithAnnotation(Custom.class);
classindex - это библиотека сканирования аннотаций времени компиляции, реализованная с использованием обработчика аннотаций.
Обычно это выполняется с помощью процесса, называемого сканированием классов. В общем случае загрузчики классов не позволяют сканировать все классы в пути к классам. Но обычно единственным используемым загрузчиком классов является UrlClassLoader
, из которого мы можем получить список каталогов и файлов jar (см. getURLs ) и открывать их один за другим для отображения доступных классов.
Этот подход реализуется такими библиотеками, как Scannotation и Reflections .
Еще один подход заключается в использовании Java Plug-and-end API обработки аннотации ], чтобы написать обработчик аннотации, который будет собирать все аннотированные классы во время компиляции и создавать файл индекса для использования во время выполнения.
Вышеупомянутый механизм реализован в библиотеке ClassIndex .
Использование сканирования на основе классов обычно на два порядка медленнее, чем индексирование во время компиляции. См. этот контрольный показатель .
Я знаю, что это старый вопрос, но я наткнулся на него в своем собственном поиске для сканирования по траектории и нашел еще один хороший ответ, поэтому я добавляю его здесь.
Google Guava имеет объект ClassPath , который обеспечивает «наилучшее усилие» сканирование классов (на самом деле это все предложения утилиты сканирования классов). Поскольку Guava является широко принятой, тщательно укомплектованной библиотекой утилиты, это отличный вариант для проектов, которые либо (а) уже используют Guava, либо (b) нуждаются в стабильной библиотеке, на которую они могут положиться для сканирования пути к классам.
@Path
-номинированные классы? – yegor256 5 November 2010 в 17:49java.class.path
может привести к неправильным результатам, когда ваш код работает на сервере приложений или когда вы используете пользовательские загрузчики классов. Не все загрузчики классов позволяют проверять пути, из которых загружаются классы. Поэтому мое утверждение: у Java нет API для этого. Вы должны прибегнуть к какой-то взлому. – Aaron Digulla 8 November 2010 в 14:21