如何在Java中使用AbstractProcessor修改方法体?

如何在Java中使用AbstractProcessor修改方法体?,java,annotation-processing,java-annotations,Java,Annotation Processing,Java Annotations,长期读者,第一次在这里张贴海报。我一直在从事一个需要使用注释处理器的项目。我知道AspectJ涵盖了我正在做的事情,但不幸的是,AspectJ需要使用AJC编译器,这在处理某些项目时会引起一些麻烦。基本上,目标是给一个带有主体的方法doSomething(),如果我用@SpecialMethod注释它,我需要在主体上方和主体之后添加一些代码 我假设阅读本文的人都熟悉注释处理,为了实现这一点,我有一个扩展了AbstractProcessor的类 完整代码如下: public class Metho

长期读者,第一次在这里张贴海报。我一直在从事一个需要使用注释处理器的项目。我知道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;
    }
}
公共类方法StatsAnnotationProcessor扩展了AbstractProcessor{
私家树;
@凌驾
public void init(ProcessingEnvironment processingEnv){
super.init(processingEnv);
trees=trees.instance(processingEnv);
}
@凌驾

public boolean process(set)不是一个简单的提示,但是你可以看看,尽管我对它还不太熟悉,不能说它更具体。当然,我不确定它们是否有修改方法体的内容,或者只是添加方法(例如getter和setter)和字段(例如logger)的机制。不幸的是,您无法使用公共api修改现有代码。您只能添加新文件和新类。因此,您需要使用某种生成子类的模式,或者使用非公共api。lombok项目确实是一个很好的例子-我已经尝试过一些,但从未尝试过实现任何东西。