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

Как написать обработчик аннотации Java?

Возможно, я просто смотрю в неправильном направлении, но я считаю, что документация JSE по обработке аннотаций очень... разрежена. Я хочу написать обработчик аннотации, который обрабатывает аннотированные строки String и локальные переменные, чтобы заменить их вычисленным выражением String. Это не должно быть слишком сложно, но я довольно потерялся в Javadoc для javax.annotation.processing.

EDIT: Мне нужно обработать аннотации во время компиляции, потому что я хочу изменить сгенерированный код. Он должен заменить аннотированные константные выражения String на вычисленное выражение String.

4b9b3361

Ответ 1

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

Если вы ищете, как написать компилятор времени, обработчик аннотации проверить https://github.com/pellaton/spring-configuration-validation-processor

Ответ 2

Два инструмента, которые делают это, Project Lombok и DuctileJ. Оба эти средства существовали в то время, когда вопрос был первоначально задан; теперь существуют дополнительные инструменты.

Основная идея заключается в том, чтобы написать обработчик аннотаций, который перемещается и модифицирует программу AST (абстрактное синтаксическое дерево) во время компиляции до генерации кода. Компилятор не изменит исходный код на диске, но сгенерированный файл .class будет отражать изменения, которые делает ваш обработчик аннотации.

Возможно, вы сможете адаптировать один из этих инструментов в соответствии с вашими потребностями или реализовать собственный инструмент, основанный на их методах реализации.

Обработка времени компиляции имеет два преимущества перед обработкой файлов классов. Во-первых, компилятор обычно имеет больше информации, чем доступно из скомпилированного кода. Другим является то, что во время компиляции все происходит за один шаг, вместо того чтобы требовать от разработчика запускать отдельный инструмент для перезаписи файлов .class после компиляции.