You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在注解处理器中将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:52:37