在注释处理器中解析方法调用

时间:2015-06-13 17:13:11

标签: java java-8 annotation-processing

我想编写一个Annotation Processor来检查只在特定位置调用Method。例如:

interface Command {
    @MustOnlyBeCalledByWorker
    void execute();
}

class Worker {
    void work(Command cmd) {
        cmd.execute(); // This is ok for the annotation processor
    }
}
class Hacker {
    void work(Command cmd) {
        cmd.execute(); // annotation processor gives an error
    }
}

我已经有一个带@SupportedAnnotationTypes("*")的注释处理器,它使用编译器树API来获取所有MethodInvocationTree

我从那里想到,我可以得到被召唤方法的声明。

现在我可以轻松获取方法名称和参数表达式。

但是我还想区分具有相同数量参数的重载execute()方法。 我需要自己处理整个重载分辨率吗?我认为这也意味着手动解析所有参数的静态类型,在某些情况下甚至是其他方法的类型参数。

所以这是我的问题:我怎样才能获得正确重载方法的正确声明?也许我可以以某种方式将其从JavacTask中取出来?

我正在使用IntelliJ IDEA 14和Oracle的Java 8编译器。目前支持语言级别7就足够了,但首选支持Java 8支持的解决方案。

0 个答案:

没有答案