使用 Eclipse JDT AST 从注解中获取完全限定名

Obtaining the fully qualified name from an Annotation using Eclipse JDT AST

我正在使用 Eclipse JDT 为 Java 源代码构建 AST,因此我可以进行一些代码分析。目前我想获得注释的完全限定名称。考虑以下代码:

import javax.persistence.Entity; 

@Entity
public class Class1

如果我访问这个编译单元,@Entity 是一个 MarkerAnnotation。我可以对其进行一些分析。但是我无法获得完全合格的名称。我想获得"javax.persistence.Entiy"。我尝试了几种方法,但都没有成功。

public boolean visit(MarkerAnnotation node) {
        node.getTypeName(); //returns the simple name
        node.getTypeName().getFullyQualifiedName();// I thought this would print javax.persistence.Entiy, 
                                                   // but it only prints "Entity"
        node.resolveTypeBinding().getName(); //Prints "Entity"
        node.resolveTypeBinding().getBinaryName(); // Prints "Entity"
        node.resolveAnnotationBinding().getName(); //Prints "Entity"
        return super.visit(node);
    }

我也尝试过将 MarkerAnnotation 转换为 Annotation,但我仍然无法获得完全限定的名称。在调试会话期间,我没有成功导航此节点

我能够使用 CompilationUnit 的 imports() 方法获得完全限定名称。我对它们进行了一些字符串操作,并结合了注释简单名称。但是,我觉得这有点 hacky,我需要查看每个导入,即使是与注释无关的导入。

我想要的是直接从节点获取完全限定名称,即从 MarkerAnnotation、NormalAnnotation 和 SingleMemberAnnotation。有什么办法可以做到这一点?我在这里错过了什么?

提前致谢!

来自 Annotation.resolveAnnotationBinding() 的 javadoc:

Note that bindings (which includes resolved annotations) are generally unavailable unless requested when the AST is being built.

所以请检查您如何配置 ASTParser,请参阅 ASTParser.setResolveBindings(boolean)