使用 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)
我正在使用 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)