Статическое метапрограммирование Java

Я хотел бы реализовать процессор аннотаций, который будет генерировать новый класс на основе существующего класса «прототип».

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, я получаю достойный результат, но конструкторы печатаются как методы с именем «» вместо методов с тем же именем, что и у его класса, поэтому мне нужно вручную распечатать все виды узлов дерева.

Вы можете увидеть код, который я пришел сюда

5
задан Victor Nazarov 5 December 2011 в 15:17
поделиться