[英]Java Compiler Tree API: Get fully qualified superclass name
我正在嘗試獲取ClassTree-Object的超類的完全限定名稱。 目前我正在使用toString() - 方法:
public class ClassScanner extends TreePathScanner<Object, Trees> {
@Override
public Object visitClass(ClassTree ct, Trees trees) {
TreePath currentPath = getCurrentPath();
TypeElement typeElement = (TypeElement) trees.getElement(currentPath);
String s = typeElement.getSuperclass().toString();
System.out.println(s);
return super.visitClass(ct, trees);
}
}
但這似乎不是一種未來的證明方法。 另外,我必須自己提取名稱,包,泛型類型...... 還有其他選擇嗎?
謝謝
怎么樣
Tree extendsClassTree = classTree.getExtendsClause();
if (extendsClassTree != null) {
superClassName = extendsClassTree.toString();
} else {
superClassName = "java.lang.Object";
}
(從這里借來:))
好的,我找到了一個解決方法:
在處理器中,將rootElements存儲在某處:
@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;
}
}
在我的例子中,我將它們存儲在一個輔助類ASTUtils中:
public class ASTUtils {
private static Set<? extends Element> rootElements = new HashSet<>();
public static Set<? extends Element> getRootElements() {
return rootElements;
}
public static void setRootElements(Set<? extends Element> rootElements) {
ASTUtils.rootElements = rootElements;
}
}
然后你可以確定TreePath:
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;
}
現在可以使用超類的TreePath來獲取相應的CompilationUnitTree並讀取包或獲取TypeElement並讀取限定名稱(請參閱之前的答案/初始帖子)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.