Я хотел бы реализовать процессор аннотаций, который будет генерировать новый класс на основе существующего класса «прототип».
import java.util.List
@MyAnnotation
class MySuperClassPrototype {
static MySuperClassPrototype createInstance() {
return new MySuperClassPrototype();
}
}
В результате кода ниже. Будет создан следующий новый исходный файл (модуль компиляции):
import java.util.List
class MySuperClass {
static MySuperClass createInstance() {
return new MySuperClass();
}
public void specialAddedMethod() {
/*...*/
}
}
Я хотел бы скопировать все операторы импорта верхнего уровня и статические члены, а не статические члены класса prototype. Я продвинулся довольно далеко с API дерева компиляторов (com.sun.source.tree). Я могу распечатать тип данных Tree при замене нового имени класса на старое. Но есть проблемы, которые кажутся довольно сложными.
Если я получаю Tree.Kind.IDENTIFIER в дереве, как я могу найти, на какой реальный класс он ссылается. Мне нужно заменить все вхождения идентификатора MySuperClassPrototype на идентификатор MySuperClass, а затем распечатать все дерево.
Возможно ли это?
Аналогичным образом мне нужно отфильтровать аннотацию @MyAnnotation, и она снова будет представлена с помощью Tree.Kind.IDENTIFIER или Tree.Kind.MEMBER_SELECT.
Как узнать фактический класс аннотаций, на который ссылается этот идентификатор?
И еще одна проблема - распечатка дерева. Если я использую метод toString, я получаю приличный результат, но конструкторы печатаются как методы с именем "" вместо методов с тем же именем, что и его класс, поэтому мне нужно вручную печатать каждый тип узла дерева.
Вы можете увидеть код, с которым я пришел сюда