我目前正在尝试实现一个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;
}
}
你们对我做错了什么或怎么做有什么想法吗?任何帮助都会得到赞赏!
答案 0 :(得分: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)
您可以使用typeDec.resolveBinding().getSuperclass()
将超类作为ITypeBinding
。从那里,您可以通过递归调用getSuperClass()
向上移动继承树,直到它返回null
或unit.getAST().resolveWellKnownType("java.lang.Object")
。