Как изменить тело метода, используя AbstractProcessor в Java? - PullRequest
0 голосов
/ 22 декабря 2019

Давний читатель, первый постер здесь. Я работал над проектом, который требует от меня использования процессора аннотаций. Я знаю, что то, что я делаю, покрывается AspectJ, но, к сожалению, AspectJ требует использования компилятора AJC, и это вызывает определенные головные боли при работе над некоторыми проектами. По сути, целью является метод doSomething() с телом, мне нужно добавить некоторый код над телом и после тела, если я аннотирую его с помощью @SpecialMethod.

Я предполагаю, что тот, кто читает это,знаком с обработкой аннотаций, для достижения этой цели у меня есть класс, который расширяет AbstractProcessor.

Полный код приведен ниже:

public class MethodStatsAnnotationProcessor extends AbstractProcessor {

    private Trees trees;

    @Override
    public void init (ProcessingEnvironment processingEnv) {
        super.init( processingEnv );
        trees = Trees.instance( processingEnv );
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for (TypeElement annotation : annotations) {
            Set<? extends Element> annotatedElements = roundEnv.getElementsAnnotatedWith(annotation);
            for(Element element : annotatedElements){
                processingEnv.getMessager().printMessage(Diagnostic.Kind.MANDATORY_WARNING,element.getSimpleName());
                processingEnv.getMessager().printMessage(Diagnostic.Kind.MANDATORY_WARNING,element.getKind().toString());
                MethodTree methodTree = (MethodTree) trees.getTree(element);
                BlockTree blockTree = methodTree.getBody();
                for (StatementTree statementTree : blockTree.getStatements()) {
                    processingEnv.getMessager().printMessage(Diagnostic.Kind.MANDATORY_WARNING,statementTree.toString());
                }
            }
            processingEnv.getMessager().printMessage(Diagnostic.Kind.MANDATORY_WARNING,annotation.getSimpleName());
        }
        return true;
    }
}

Я знаю, что код очень универсальный - до сих порПроцессор успешно распечатывает имя метода и операторы в теле, но я не понимаю, как я могу добавить операторы, учитывая, что StatementTree - интерфейс, который, кажется, не имеет очень четкого API. В идеале, если бы кто-нибудь мог предоставить даже простую подсказку, такую ​​как, как добавить System.out.println("Hello") в начале тела метода, это было бы очень полезно. Спасибо всем заранее.

...