Давний читатель, первый постер здесь. Я работал над проектом, который требует от меня использования процессора аннотаций. Я знаю, что то, что я делаю, покрывается 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")
в начале тела метода, это было бы очень полезно. Спасибо всем заранее.