簡體   English   中英

如何在AST eclipse中檢索有關類的繼承信息?

[英]How can I retrieve inheritance information about a Class in AST eclipse?

我目前正在嘗試實現一個Eclipse插件來計算Java應用程序的一些OO指標,如DIT(繼承樹的深度)。 但是,我無法檢索有關Class繼承樹的信息(類到Object之間的距離)。 假設一個類是CompilationUnit,我試圖通過TypeDeclaration進入類來比較類,例如,Dog(extends Animal)是否是Object的一個實例。 如果沒有,則對訪問方法進行遞歸調用,將Animal類作為參數傳遞,直到該類為Object。

編輯我設法使用typeDec.getSuperClassType()恢復超類,但是我需要獲取此超類的TypeDeclaration以遞歸方式調用visit方法,並將此TypeDeclaration作為參數傳遞。

這是我的代碼的想法:

public class ClassVisitor extends ASTVisitor { 

 depthOfInheritanceTreeIndex = 1;

 public boolean visit(CompilationUnit unit) {
    for (Object type :unit.types()){

        TypeDeclaration typeDec = (TypeDeclaration) type;

        Type superClassType = typeDec.getSuperClassType();

        TypeDeclaration superClazz;
        if (superClassType.equals(Object.class.getSimpleName())){
            return continue;
        }else{
            depthOfInheritanceTreeIndex++;
            superClazz = (TypeDeclaration) superClassType.getParent();
            return super.visit(superClazz);
        }
    }
    return false;
 }
}

你們對我做錯了什么或怎么做有什么想法嗎? 任何幫助都會得到贊賞!

這里最好的辦法是避免使用AST API並使用Java模型API。 AST旨在操縱和分析Java源代碼,但模型API旨在分析和操作Java程序的結構。

API源自IJavaElement接口。 你需要做這樣的事情:

IFile myJavaFile = <get the file>
ICompilationUnit unit = JavaCore.createFromFile(myJavaFile);
IType[] types = unit.getAllTypes();
for (IType type : types) {
  ITypeHierarchy th= type.newTypeHierarchy(null);
  // do something with the hierarchy
}

這將比基於AST生成層次結構更靈活。 但是有一些警告:

  1. 這可能需要很長時間才能計算(特別是對於大型層次結構)
  2. 因此,如果可能,您可能只想使用超類型層次結構,計算速度要快得多。

你可以使用typeDec.resolveBinding().getSuperclass()來獲取超類作為ITypeBinding 從那里,您可以通過遞歸調用getSuperClass()向上移動繼承樹,直到它返回nullunit.getAST().resolveWellKnownType("java.lang.Object")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM