Я хотел бы реализовать процессор аннотаций, который будет генерировать новый класс на основе существующего класса «прототип».
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() {
/*...*/
}
}
Я хотел бы скопировать все операторы импорта верхнего уровня и статические члены, а не статические члены класса прототипа. Я довольно далеко продвинулся с Compiler Tree API (com.sun.source.tree). Я могу распечатать тип данных Tree, подставляя новое имя класса вместо старого. Но есть проблемы, которые кажутся довольно сложными.
Если я получаю Tree.Kind.IDENTIFIER в дереве, как я могу найти, на какой именно класс он ссылается. Мне нужно заменить все вхождения идентификатора MySuperClassPrototype идентификатором MySuperClass, а затем распечатать все дерево.
Возможно ли это?
Точно так же мне нужно отфильтровать аннотацию @MyAnnotation, и снова она представлена с помощью Tree.Kind.IDENTIFIER или Tree.Kind.MEMBER_SELECT.
Как я могу узнать реальный класс аннотации, на который ссылается этот идентификатор?
И еще одна проблема - распечатать дерево. Если я использую метод toString, я получаю достойный результат, но конструкторы печатаются как методы с именем «
Вы можете увидеть код, который я пришел сюда