我目前正在尝试实现一个 Eclipse 插件来计算 Java 应用程序的一些 OO 指标,如 DIT(继承树深度)。但是,我无法检索有关类继承树的信息(类与对象之间的距离)。假设一个类是一个 CompilationUnit,我试图通过 TypeDeclaration 进入这个类来比较这个类,例如 Dog(扩展 Animal)是否是 Object 的一个实例。如果不是,则递归调用将 Animal 类作为参数传递给 visit 方法,直到该类为 Object。
编辑 我设法使用 typeDec.getSuperClassType()
恢复了父类(super class),但是我需要获取这个父类(super class)的 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;
}
}
你们对我做错了什么或如何做有任何想法吗?我们将不胜感激!
最佳答案
最好的办法是避免使用 AST API,而改用 Java 模型 API。 AST是用来操作和分析Java源代码的,而模型API是用来分析和操作Java程序的结构的。
API Root 于 IJavaElement
接口(interface)。你需要做这样的事情:
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 生成层次结构相比,这将为您提供更多的灵 active 。不过,有一些警告:
- 这可能需要很长时间来计算(尤其是对于大型层次结构)
- 出于这个原因,您可能希望尽可能只使用父类(super class)型层次结构,这样计算起来要快得多。
关于java - 如何在 AST eclipse 中检索有关类的继承信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17396800/