解析注解处理器中的方法调用

LQu*_*rat 5 java annotation-processing java-8

我想写一个注解处理器来检查一个方法是否只在特定的地方被调用。例如:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经有一个注释处理器,@SupportedAnnotationTypes("*")它使用 Compiler Tree API 来获取所有MethodInvocationTrees。

我认为从那里,我可以获得被调用方法的声明。

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

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

所以这是我的问题:如何获得潜在重载方法的正确声明?也许我能以某种方式把它弄出来JavacTask

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