2013-07-01 38 views
1

我正在嘗試實現一個Eclipse插件來計算Java應用程序的一些OO度量標準,如DIT(繼承樹深度)。但是,我無法檢索有關類繼承樹的信息(直到Object的類之間的距離)。假設一個類是一個CompilationUnit,我試圖通過TypeDeclaration進入類來比較這個類,例如Dog(extends Animal)是否是Object的一個實例。如果沒有,它會對傳遞Animal類作爲參數的visit方法進行遞歸調用,直到類爲Object。如何檢索有關AST eclipse中的類的繼承信息?

編輯我設法恢復使用typeDec.getSuperClassType()超,但是我需要得到這個超類的TypeDeclaration遞歸調用訪問方法,通過這個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; 
} 
} 

你們是否有什麼我做錯了或怎麼做任何想法?任何幫助將會得到讚揚!

回答

2

這裏最好的選擇是避免使用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. 出於這個原因,您可能希望只使用超類型層次結構如果可能的話,這是更快計算。
+0

謝謝安德魯,它的工作原理! – mari

1

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

+0

這種方法具有呆在AST API中的優點。當然,可以將AST API與Jav​​a Model API混合使用,但它們有不同的假設和行爲。 –

+0

unit.getAST()。resolveWellKnownType(「java.lang.Object」)爲我返回null。那是由於eclipse jdt的配置錯誤嗎?我在獨立模式下使用它 – alextsil