Java 解析注释处理器中的方法调用
我想编写一个注释处理器来检查是否只在特定位置调用方法。例如:Java 解析注释处理器中的方法调用,java,java-8,annotation-processing,Java,Java 8,Annotation Processing,我想编写一个注释处理器来检查是否只在特定位置调用方法。例如: interface Command { @MustOnlyBeCalledByWorker void execute(); } class Worker { void work(Command cmd) { cmd.execute(); // This is ok for the annotation processor } } class Hacker { void work
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
s
我认为从那里,我可以得到被调用方法的声明
现在我可以很容易地得到方法名和参数表达式
但是假设我还想区分具有相同数量参数的重载execute()
方法。
我需要自己处理整个过载解决方案吗?我认为这也意味着手动解析所有参数的静态类型,在某些情况下甚至解析其他方法的类型参数
因此,我的问题是:如何获得潜在重载方法的正确声明?也许我能从JavacTask
中找到它
我正在使用IntelliJ IDEA 14和Oracle的Java 8编译器。目前,支持语言级别7就足够了,但最好是支持Java 8的解决方案。AspectJ可以与控制流一起工作,也许这会对您有所帮助。好吧,我发现使用AbstractTypeProcessor,我可以使用
final ExecutableElement calledMethod=utils.getCalledMethod获得调用的方法(SmartTreePath.getPath(getCurrentPath(),node));
我以前没有尝试过,因为我发现的唯一提示是这个类已经在Java 7中被再次添加和删除。现在我从这里使用实现:[我不确定这样做是否得到官方支持,但现在这是可行的。