Javapoet / JavaWriter добавить к существующему классу

Я экспериментировал с генерацией кода в процессоре аннотаций.

Рассмотрим следующий фрагмент кода, который добавляет конструктор с оператором.

private void addRegister(ExecutableElement el) {
    MethodSpec builder = MethodSpec.constructorBuilder().addStatement("$T.register(this)", EventExecutor.class).build();
    TypeSpec spec = TypeSpec.classBuilder(el.getEnclosingElement().getSimpleName().toString()).addOriginatingElement(el).addMethod(builder).build();
    JavaFile file = JavaFile.builder(pEnv.getElementUtils().getPackageOf(el.getEnclosingElement()).getQualifiedName().toString(), spec).build();
    pEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, file.toString());
}

Теперь, когда дан исполняемый элемент с именем «bla» в классе «Test», результат будет следующим:

class Test {
   Test() {
     EventExecutor.register(this);
   }
}

Однако этот класс уже существует, и я хочу добавить конструктор к существующему коду, а не создавать здесь этот новый класс.

Существующий код:

public class Test {

    @Event
    public void bla(TestEvent event) {

    }
}

Я могу это сделать?


person Limnic    schedule 27.04.2015    source источник
comment
возможный дубликат Замена кода обработчиком аннотаций   -  person nhaarman    schedule 31.05.2015
comment
Вы наконец нашли способ это сделать?   -  person coolguy    schedule 05.02.2016
comment
@coolguy Вместо того, чтобы пытаться добавить к существующим классам, мою цель также можно было бы достичь, используя ASM для изменения среды выполнения, а также используя аспектно-ориентированное программирование с использованием AspectJ. Однако я понял, что если бы я использовал этот подход сейчас, было бы лучше, если бы я просто сгенерировал новый временный класс и вручную добавил содержимое этого класса в существующий файл. (Без магии)   -  person Limnic    schedule 05.02.2016


Ответы (1)


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

person xcesco    schedule 09.07.2018