Как Вы используете Обработку аннотации Java 1.6 для выполнения времени компиляции, переплетаясь?

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

Мой процессор аннотации похож на это;

@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
    }
}
7
задан Steve 28 April 2010 в 08:03
поделиться

3 ответа

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

-2
ответ дан 6 December 2019 в 14:01
поделиться

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

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

6
ответ дан 6 December 2019 в 14:01
поделиться

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

6
ответ дан 6 December 2019 в 14:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: