Ответ 1
Я создал набор аннотаций JavaBean (http://code.google.com/p/javadude/wiki/Annotations)
[Примечание: сейчас я работаю над новой версией, поэтому код соединительной линии не соответствует загрузке сайта обновлений.
Тестирование
Тестирование их может быть довольно сложным...
Я обычно подхожу к нему, создавая проект в eclipse с помощью тестового кода и строя его, затем делаю копию и отключая обработку аннотаций.
Затем я могу использовать Eclipse для сравнения "активного" тестового проекта с "ожидаемой" копией проекта.
У меня еще не слишком много тестовых примеров (очень утомительно создавать так много комбинаций атрибутов), но это помогает.
Система сборки
Использование аннотаций в системе сборки на самом деле очень просто. Взгляните на http://code.google.com/p/javadude/wiki/Annotations для примера того, как он используется в ant script, а его использование в eclipse - это просто вопрос создания плагина с указанием расширения обработчика аннотаций и включения обработки аннотаций в проектах, которые хотят его использовать.
Я использовал обработку аннотаций в непрерывной среде сборки, построил аннотации и процессор, а затем использовал ее в остальной части сборки. Это действительно очень безболезненно.
Время обработки
Я не считаю, что это проблема - будьте осторожны с тем, что вы делаете в процессорах. Я генерирую много кода в моем, и он работает нормально. Это немного медленнее в ant.
Обратите внимание, что процессоры Java6 могут работать немного быстрее, потому что они являются частью обычного процесса компиляции. Тем не менее, у меня возникли проблемы с тем, чтобы они работали правильно в генерации кода (я думаю, что большая часть проблемы - поддержка eclipse и запуск многофазных компиляторов). На данный момент я придерживаюсь Java 5.
Обработка ошибок
Это одна из самых прозаических вещей в API аннотации. API имеет объект "мессенджер", который обрабатывает все ошибки. Каждая среда IDE предоставляет реализацию, которая преобразует ее в соответствующие сообщения об ошибках в нужном месте в коде.
Единственное, что я делал, это бросить объект среды обработки, чтобы я мог проверить, был ли он запущен как сборка или согласование редактора. Если редактирование, я выхожу. В конце концов я изменю это, чтобы просто проверять ошибки во время редактирования, чтобы он мог сообщать о ошибках по мере ввода. Однако будьте осторожны - вам нужно поддерживать его очень быстро для использования во время согласования, или редактирование становится вялым.
Генерация кода Gotcha
[добавлено немного больше комментариев]
В спецификациях процессора аннотаций указано, что вам не разрешено изменять класс, содержащий аннотацию. Я подозреваю, что это упрощает обработку (в дальнейших раундах не нужно включать аннотированные классы, предотвращая также бесконечные петли обновления)
Однако вы можете создавать другие классы, и они рекомендуют этот подход.
Я создаю суперкласс для всех методов get/set и всего, что мне нужно для создания. У меня также есть процессор, проверяющий, что аннотированный класс расширяет сгенерированный класс. Например:
@Bean(...)
public class Foo extends FooGen
Я генерирую класс в том же пакете с именем аннотированного класса плюс "Gen" и проверяю, что объявленный класс объявлен для его расширения.
Я видел, как кто-то использовал дерево компилятора api для изменения аннотированного класса - это противоречит спецификации, и я подозреваю, что они закроют это отверстие в какой-то момент, так что это не сработает.
Я бы рекомендовал создать суперкласс.
В целом
Мне очень нравится использование обработчиков аннотаций. Очень хорошо разработан, особенно глядя на независимость от IDE/командной строки.
В настоящее время я рекомендую придерживаться аннотационных процессоров Java5, если вы создаете код - вам нужно запустить отдельный инструмент apt для их обработки, а затем выполнить компиляцию.
Обратите внимание, что API-интерфейсы для Java 5 и Java 6 отличаются! API обработки Java 6 лучше IMHO, но мне просто не повезло с процессорами java 6, которые делают то, что мне нужно.
Когда Java 7 выйдет, я дам новый подход к обработке еще одним выстрелом.
Не стесняйтесь, напишите мне, если у вас есть вопросы. ([email protected])
Надеюсь, это поможет!