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

Как я могу просмотреть все исходное дерево с помощью обработчика аннотаций?

У меня много классов обработчиков, которые обрабатывают определенные типы сообщений. Чтобы зарегистрировать все эти обработчики, мне нужно знать, какие из них существуют. В настоящее время все они аннотируются с конкретной аннотацией, и я использую обработчик аннотации Java 6, чтобы получить все из них, и создаю класс Register, который содержит экземпляр каждого из аннотированных типов.

Это отлично работает, если все дерево создается сразу, но если только один из аннотированных классов строится (например, когда я сохраняю файл в Eclipse), процессор видит только этот тип и строит неполный. Как я могу просмотреть другие типы в этом сценарии?

4b9b3361

Ответ 1

Я решил это достаточно хорошо. То, что я сделал, немного взломан, но в основном для каждого аннотированного класса, который я вижу, я добавляю его имя в HashSet. Затем я использую Filer.getResource(), чтобы открыть файл, где я записал все ранее увиденные аннотированные классы и добавлю их в HashSet. Затем я генерирую класс register и записываю весь HashSet на тот же ресурс с помощью Filer.createResource(). Это вызовет проблемы, если я удалю аннотированный тип, так как он все равно будет записан в этот файл, но я могу просто очистить проект или удалить этот файл, чтобы решить его.

EDIT: Кроме того, я считаю, что передача соответствующих "исходных элементов" в Filer.createSource() должна позволить Eclipse правильно отслеживать эти зависимости, но это не так. Возможно, это ошибка Eclipse.

Ответ 2

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

Одним из решений является изменение вашей архитектуры для поддержки инкрементной компиляции. Например, для каждого аннотированного HandlerClass, сгенерируйте класс RegisterHandlerClass, который регистрирует этот класс обработчика.

Тем не менее, звучит так, как будто вы делаете лучше во время выполнения, возможно, с помощью такого инструмента, как Reflections.