繁体   English   中英

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

[英]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生成层次结构更灵活。 但是有一些警告:

  1. 这可能需要很长时间才能计算(特别是对于大型层次结构)
  2. 因此,如果可能,您可能只想使用超类型层次结构,计算速度要快得多。

你可以使用typeDec.resolveBinding().getSuperclass()来获取超类作为ITypeBinding 从那里,您可以通过递归调用getSuperClass()向上移动继承树,直到它返回nullunit.getAST().resolveWellKnownType("java.lang.Object")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM