我想编写一个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支持的解决方案。