如何在注解处理器中将TreePath扫描传播至父类方法定义?
问题描述
类层次结构
public class AClass { String getSomething() { ... } }
public class BClass extends AClass { @Override @CustomAnnotation String getSomething() { super.getSomething(); } }
Gradle工程结构
- A:定义
AClass的子项目 - B:定义
BClass的子项目 - processor:定义注解处理器的子项目
子项目B将子项目processor作为注解处理器依赖。
注解处理器与扫描器实现
我实现了一个注解处理器,用于访问带有@CustomAnnotation注解的元素,同时编写了如下TreePath扫描器:
class MyScanner extends TreePathScanner<String, Trees> { String result; ... public String scan(TreePath treePath, Trees trees) { super.scan(treePath, trees); return result; } @Override public String visitMethodInvocation(MethodInvocationTree node, Trees trees) { // 在此处初始化result字段 return super.visitMethodInvocation(node, trees); } }
其中,TreePath由代表被注解方法(即BClass.getSomething())的ExecutableElement构造而来,Trees通过处理器的init方法实例化:Trees.instance(processingEnv);。
需求与问题
BClass.getSomething()的方法体仅包含super.getSomething(),我希望能对该父类方法的定义启动额外的TreePath扫描,即把扫描传播至父类方法元素。
我已在visitMethodInvocation中获取到super.getSomething()对应的ExecutableElement,并尝试用它获取新的TreePath用于扫描,但调用trees.getPath(trees.getElement(this.getCurrentPath()))返回了null,该方案无效。
调试发现:AClass.getSomething()和BClass.getSomething()对应的ExecutableElement的外围TypeElement(即AClass和BClass)处理方式不同——后者有明确的绝对路径源文件,前者仅为无真实路径的“类源”。
内容的提问来源于stack exchange,提问作者zsz
相关产品推荐
相关产品推荐

