6

Я создал аннотацию, применил ее к DTO и написал аннотационный процессор стиля Java 1.6. Я могу видеть, как заставить annotationProcessor записывать новый исходный файл, чего я не хочу делать, я не вижу или не знаю, как его изменить существующий класс (в идеале просто изменить байтовый код). Модификация фактически довольно тривиальна, и все, что я хочу, чтобы процессор выполнял, - это вставить новый getter и setter, где имя происходит от значения обрабатываемой аннотации.Как использовать обработку аннотации Java 1.6 для выполнения компиляции во времени?

Мой обработчик комментариев выглядит следующим образом;

@SupportedSourceVersion(SourceVersion.RELEASE_6) 
@SupportedAnnotationTypes({ "com.kn.salog.annotation.AggregateField" }) 
public class SalogDTOAnnotationProcessor extends AbstractProcessor { 

    @Override 
    public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) { 
     //do some stuff 
    } 
} 

ответ

-2

Вы должны расширить javac компилятор для этого, а это значит строить свою программу не будет столь портативным, как обычное приложение. См. http://weblogs.java.net/blog/cayhorstmann/archive/2006/06/say_no_to_prope.html для получения более подробной информации о том, как кто-то достиг этого.

+1

Это, безусловно, решение, но я уверен, что это не единственное решение. То, что я хочу сделать, может быть сделано несколькими существующими фреймворками/инструментами, например javassist. Я пытался избежать введения зависимости, которая, как представляется, не является строго необходимой, но введение обработки аннотаций в JDK1.6 выглядело так же, как и функции javassist. Возможно, я был неправ, хотя мне все еще нужно Инструмент сторонней стороны для выполнения ткачества во время компиляции. – Steve

6

По дизайну средство обработки аннотаций не допускает прямой модификации обрабатываемого исходного кода. Однако можно создавать подклассы обрабатываемого типа или суперкласс обрабатываемого типа. При некотором планировании это позволяет частично изменить тип рассматриваемого типа. Я написал пример того, как это может сочетаться; см. this blog entry для более подробного объяснения и некоторых примеров кода.

6

Вы ищете «Инструментарий», который представляет собой рамки, такие как AspectJ do. В этом случае вам нужно указать банку в командной строке с параметром «-agent», а затем иметь возможность фильтровать все загруженные классы. Во время этого шага фильтра вы можете проверить аннотации и изменить байт-код, прежде чем он загрузится на виртуальной машине. Библиотеки для выполнения фактической модификации байт-кода включают «asm» и, возможно, обложки с высоким уровнем «cglib» и «javassist». Вы даже можете предварительно скомпилировать свои классы для создания списка классов, которые должны быть вам установлены, чтобы сделать фильтрацию в начале немного быстрее.

См. Java.lang.instrumentation для получения дополнительной информации.

4

Вы должны использовать классы внутреннего компилятора - вдохновение:

Но это балансирование на грани войны. Ваша программа будет компилироваться только на Sun/OpenJDK, и в будущих версиях могут возникнуть проблемы (внутренний API может измениться). Хотя после компиляции он является стандартным байт-кодом и будет работать везде.

BTW: если вы хотите использовать его в Eclipse, вы должны добавить для него специальную поддержку, потому что Eclipse использует нестандартный компилятор. Ваш дизайн должен быть более сложным, и вы должны добавить уровень абстракции к вашему процессору - например, Lombok.

+0

Это потрясающие примеры. Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^