java - 从 Java Annotation Processor 访问源代码

标签 java annotations annotation-processing

我正在尝试从 Java 注释处理器中访问某种类型的实际原始源代码。这有可能吗?谢谢!

最佳答案

我遇到了一个问题,我必须访问一些源代码(非字符串/非原始常量的初始化代码)并通过 Compiler Tree API 访问源代码解决了这个问题.

这是一般的配方:

<强>1。创建自定义 TreePathScanner:

private static class CodeAnalyzerTreeScanner extends TreePathScanner<Object, Trees> {

private String fieldName;

private String fieldInitializer;

public void setFieldName(String fieldName) {
    this.fieldName = fieldName;
}

public String getFieldInitializer() {
    return this.fieldInitializer;
}

@Override
public Object visitVariable(VariableTree variableTree, Trees trees) {
    if (variableTree.getName().toString().equals(this.fieldName)) {
        this.fieldInitializer = variableTree.getInitializer().toString();
    }

    return super.visitVariable(variableTree, trees);
}

<强>2。在您的 AbstractProcessor 中,通过覆盖 init 方法保存对当前编译树的引用:

@Override
public void init(ProcessingEnvironment pe) {
    super.init(pe);
    this.trees = Trees.instance(pe);
}

<强>3。获取 VariableElement 的初始化源代码(在您的例子中是一个枚举):

// assuming theClass is a javax.lang.model.element.Element reference
// assuming theField is a javax.lang.model.element.VariableElement reference
String fieldName = theField.getSimpleName().toString();
CodeAnalyzerTreeScanner codeScanner = new CodeAnalyzerTreeScanner();
TreePath tp = this.trees.getPath(theClass);

codeScanner.setFieldName(fieldName);
codeScanner.scan(tp, this.trees);
String fieldInitializer = codeScanner.getFieldInitializer();

就是这样!最后,fieldInitiliazer 变量将包含用于初始化常量的确切代码行。通过一些调整,您应该能够使用相同的配方来访问源代码树中其他元素类型的源代码(即方法、包声明等)

有关更多阅读和示例,请阅读此 article: Source Code Analysis Using Java 6 APIs .

关于java - 从 Java Annotation Processor 访问源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6373145/

相关文章:

java - 如何将 IntBuffer 复制到 int[]

java - 从 map 中随机选择 n 个项目

c++ - 向 PDF 添加 FreeText 注释

spring - @Service 中的 @Autowired ServletContext

java - 指定注释处理器的顺序

java - 获取注释处理器中生成的注释的所有值

intellij-idea - 使用 Gradle idea 插件将 Jpa Metamodel 生成的文件添加到 Intellij Idea 源

java - 在 GWT 的客户端生成随机代码

java - SOAP UI 中 JAXB 中的空白非强制日期字段问题

Java - 使用 guice 拦截方法?