java - 如何在 AST eclipse 中检索有关类的继承信息?

标签 java eclipse eclipse-plugin abstract-syntax-tree

我目前正在尝试实现一个 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 。不过,有一些警告:

  1. 这可能需要很长时间来计算(尤其是对于大型层次结构)
  2. 出于这个原因,您可能希望尽可能只使用父类(super class)型层次结构,这样计算起来要快得多。

关于java - 如何在 AST eclipse 中检索有关类的继承信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17396800/

相关文章:

eclipse - 使 Eclipse "run configuration"显示在指定文件类型的上下文菜单中

java - 无法按照 Javadoc 中的描述使用 @JsonCreator 正确反序列化 JSON

java - TestNG 中@BeforeMethod 和@AfterMethod 之间共享驱动程序

SWT 颜色选择器小部件

java - Eclipse插件: Link MulitPageEditorPart with Navigator

java - 容器 'Maven Dependencies' 引用了不存在的库 - STS

java - 根据一个数组对相同大小的数组进行排序

java - 即使计算机进入休眠模式,应用程序也必须运行

Eclipse - 更新/安装新软件非常慢

java - Spring错误java.lang.NullPointerException