Java编译器树API:获取完全限定的超类名称

Java编译器树API:获取完全限定的超类名称,java,tree,compiler-construction,qualified,Java,Tree,Compiler Construction,Qualified,我试图获取ClassTree对象的超类的完全限定名。目前我正在使用toString()方法: 公共类ClassScanner扩展了TreePathScanner{ @凌驾 公共对象visitClass(类树ct、树){ TreePath currentPath=getCurrentPath(); TypeElement=(TypeElement)trees.getElement(currentPath); 字符串s=typeElement.getSuperclass().toString();

我试图获取ClassTree对象的超类的完全限定名。目前我正在使用toString()方法:

公共类ClassScanner扩展了TreePathScanner{
@凌驾
公共对象visitClass(类树ct、树){
TreePath currentPath=getCurrentPath();
TypeElement=(TypeElement)trees.getElement(currentPath);
字符串s=typeElement.getSuperclass().toString();
系统输出打印项次;
返回super.visitClass(ct,trees);
}
}
但这似乎不是一个未来的证明方法。此外,我还必须提取名称,包,泛型类型。。。我一个人。还有别的选择吗

谢谢

怎么样

    Tree extendsClassTree = classTree.getExtendsClause();
    if (extendsClassTree != null) {
        superClassName = extendsClassTree.toString();
    } else {
        superClassName = "java.lang.Object";
    }
(借自:)

怎么样

    Tree extendsClassTree = classTree.getExtendsClause();
    if (extendsClassTree != null) {
        superClassName = extendsClassTree.toString();
    } else {
        superClassName = "java.lang.Object";
    }

(借用自:)

好的,我找到了一个解决方法:

在处理器中,将根元素存储在以下位置:

@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes("*")
public class AnnotationProcessor extends AbstractProcessor {

    private Trees trees;
    private List<TreeScanner<?, Trees>> scanners = new LinkedList<>();

    public void addScanner(TreeScanner<?, Trees> scanner) {
        scanners.add(scanner);
    }

    public void removeScanner(TreeScanner<?, Trees> scanner) {
        scanners.remove(scanner);
    }

    @Override
    public synchronized void init(final ProcessingEnvironment processingEnvironment) {
        super.init(processingEnvironment);
        trees = Trees.instance(processingEnvironment);
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        if (!roundEnv.processingOver()) {
            ASTUtils.setRootElements(roundEnv.getRootElements());
            for (final Element element : roundEnv.getRootElements()) {
                CompilationUnitTree compilationUnit = trees.getPath(element).getCompilationUnit();
                for (TreeScanner<?, Trees> scanner : scanners) {
                    scanner.scan(compilationUnit, trees);
                }
            }
        }
        return true;
    }
}

现在可以使用超类的TreePath获取相应的CompliationUnitTree并读取包,或者获取TypeElement并读取限定名(请参见前面的答案/初始帖子)。

好的,我找到了一个解决方法:

在处理器中,将根元素存储在以下位置:

@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes("*")
public class AnnotationProcessor extends AbstractProcessor {

    private Trees trees;
    private List<TreeScanner<?, Trees>> scanners = new LinkedList<>();

    public void addScanner(TreeScanner<?, Trees> scanner) {
        scanners.add(scanner);
    }

    public void removeScanner(TreeScanner<?, Trees> scanner) {
        scanners.remove(scanner);
    }

    @Override
    public synchronized void init(final ProcessingEnvironment processingEnvironment) {
        super.init(processingEnvironment);
        trees = Trees.instance(processingEnvironment);
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        if (!roundEnv.processingOver()) {
            ASTUtils.setRootElements(roundEnv.getRootElements());
            for (final Element element : roundEnv.getRootElements()) {
                CompilationUnitTree compilationUnit = trees.getPath(element).getCompilationUnit();
                for (TreeScanner<?, Trees> scanner : scanners) {
                    scanner.scan(compilationUnit, trees);
                }
            }
        }
        return true;
    }
}

现在可以使用超类的TreePath获取相应的CompliationUnitTree并读取包,或者获取TypeElement并读取限定名(请参见前面的答案/初始帖子)。

谢谢,但我还必须使用toString()方法并分析输出。我希望避免使用任何toString()-方法。我希望有一个或多个方法是合理的文档和/或命名的。谢谢,但是我还必须使用toString()方法并分析输出。我希望避免使用任何toString()-方法。我希望有一个或多个方法是合理的文档和/或命名的。现在哪个部分对您来说似乎不是未来的证据?使用“toString”-方法。当然,“toString”方法将存在于未来的版本中。但是返回字符串的语义和语法是否相同?好的,请看一看。getQualifiedName可用于TypeElement。但是超类是一棵树或是一个类型镜像。现在你觉得哪一部分不是未来的证明呢?使用“toString”方法。当然,“toString”方法将存在于未来的版本中。但是返回字符串的语义和语法是否相同?好的,请看一看。getQualifiedName可用于TypeElement。但超类是树或类型镜像。
public static TreePath find(Tree tree, Trees trees) {
    for (Element e : ASTUtils.getRootElements()) {
        CompilationUnitTree compilationUnit = trees.getPath(e).getCompilationUnit();
        TreePath path = TreePath.getPath(compilationUnit, tree);
        if (path != null) {
            Tree classTree = trees.getTree(trees.getElement(path));
            if (classTree != null && classTree.getKind() == kind) {
                return path;
            }
        }
    }
    return null;
}