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中被再次添加和删除。现在我从这里使用实现:[我不确定这样做是否得到官方支持,但现在这是可行的。