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 的解决方案。