У меня есть куча исходных файлов для классов Java. Я хочу найти те классы, которые аннотируются определенным классом аннотаций. Имена этих классов должны быть записаны в файл списка поставщиков услуг.Выберите классы с заданной аннотацией
Есть ли какие-либо механизмы, которые я мог бы использовать, чтобы помочь мне с этой задачей? Или я должен реализовать это сам с нуля?
Если бы мне пришлось это сделать сам, есть несколько подходов, о которых я могу думать.
Создать задачу Ant на Java. Создайте ли он
ClassLoader
с помощью подходящего (возможно настраиваемого) класса. Используйте этот загрузчик, чтобы (попытаться) загрузить классы, соответствующие входным файлам, чтобы проверить их аннотации. Требуется сохранение аннотации во время выполнения и полная инициализация всех задействованных классов и их зависимостей.Используйте javap для проверки классов. Поскольку я не знаю программного интерфейса с
javap
(вы?), Это, вероятно, означает итерацию по файлам и запуск нового процесса для каждого из них, а затем массирование созданного вывода подходящим способом. Возможно, для этого может быть использована задача<scriptdef>
. Это будет работать с сохранением аннотаций классов и не требует инициализации.Используйте обработчик аннотации для сбора информации во время компиляции. Это должно иметь возможность работать с сохранением исходного кода. Но у меня нет опыта написания или использования компиляторов аннотаций, поэтому я не уверен, что это сработает и потребует много исследований, чтобы выяснить некоторые детали. В частности, как активировать задачу для использования ant (Java 6 annotation processing configuration with Ant дает некоторые указатели на это, как и What is the default annotation processors discovery process?), и когда создавать выходной файл (в каждом раунде или только в последнем раунде).
Какой из них, по вашему мнению, имеет наибольшие шансы на успех? Можете ли вы предложить образцы кода для одного из них, которые могут быть близки к тому, что я хочу, и которые я мог бы соответствующим образом адаптировать?
Я бы, вероятно, использовал вариант 3, т. Е. Препроцессор аннотации, но я не могу предоставить какой-либо код или пример. Однако, может быть, есть другой способ, для чего нужны эти службы? Может ли поиск по времени выполнения работать на вас? – Thomas
@Thomas: У нас в настоящее время есть поиск во время выполнения, и, к моему удивлению, он недавно сломался, когда я представил индексацию файлов jar. Среда выполнения также означала, что файлы jar должны были загружаться дважды, один раз для загрузчика классов и один раз для перечисления элементов. – MvG
Хм, это кажется довольно странным, но я мало знаю о вашем коде :). Вы могли бы попробовать что-то вроде отражений google (которые подключались бы к иерархии загрузчика классов IIRC), или если вы можете использовать использование CDI для поиска сервисов/beans после их загрузки. Нет необходимости загружать банку дважды. – Thomas