[英]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生成層次結構更靈活。 但是有一些警告:
你可以使用typeDec.resolveBinding().getSuperclass()
來獲取超類作為ITypeBinding
。 從那里,您可以通過遞歸調用getSuperClass()
向上移動繼承樹,直到它返回null
或unit.getAST().resolveWellKnownType("java.lang.Object")
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.