由CompilationUnit得到SuperClass的方法

做BTF项目的时候, 要判断一个类是否继承了某个指定类.

由于类还是在Eclipse的JDT中, 没有被Load, 所以java.lang.Class.getSuperclass()不中了.

查找一番原来可以通过CompilationUnit获取org.eclipse.jdt.core.IType,

然后IType.newSupertypeHierarchy(*)得到ITypeHierarchy, 继而就能用ITypeHierarchy.getSuperclass(IType)得到其超类了.

IType[] types = ((ICompilationUnit)javaElement).getTypes();
    if(null != types && types.length > 0){
         ITypeHierarchy typeHierarchy = types[0].newSupertypeHierarchy(null);
             IType superclass = typeHierarchy.getSuperclass(types[0]);
                if(superclass instanceof ResolvedBinaryType){
                 …

                  }
         }
}

作者:Gem Chen

原谅我这一生不羁放纵爱自由

17条评论

  1. @Gem 人生像茶几,上面摆满了杯具;人生又像茶杯,本身就是个杯具;人生更像茶叶,终究要被浸泡在杯具之中。

    1. 人生就像茶几,上面摆满了杯具。当你努力跳出一个杯具时,却发现自己跳进了一个餐具(惨剧)。

      1. 人生就像是一个茶几,上面摆满了杯具。当我们认为自己跳出一个杯具时,却已经掉进了另外一个杯具。而若你发现你没有跳进另一个杯具……那恭喜你……你掉下茶几了。

    2. 人生是一只茶几,上面放满了杯具。而本身就是杯具的我们还非加上茶叶自以为与别人没有茶具(差距),结果人人都说咱现在要具就用餐具(惨剧)。我们在沉默中灭亡,成了文具;在沉默中爆发,成了火炬。我们想明哲保身,都成了面具。我们想一鸣惊人,都成了京剧。不能再次相聚,执手相看泪眼,成了默剧。生活是自己的杯具,别人眼里的洗具(喜剧)。

  2. 你好,看了你的文章我知道了可以直接得到类的父类,但是我找不到你文章你里的javaElement,不知道你是怎么得到的?我是这样得到CompilationUnit的
    ASTParser parser = ASTParser.newParser(AST.JLS3); //initialize
    parser.setSource(source.toCharArray()); //content is a 、 CompilationUnit CompilationUnit result = (CompilationUnit) parser.createAST(null);
    IJavaElement javaElement=result.getJavaElement();
    但是这里面的javaElement为空,不知道你的是怎么样子的

    1. 这里的javaElement实质上就是个CompilationUnit类型的参数,由前面的程序生成的。
      我找了一下CompilationUnit的代码好像没有getJavaElement这个方法(jdk1.6).
      不过你看看这篇文章对你有没有帮助:http://www.ibm.com/developerworks/cn/opensource/os-ast/index.html

        1. //因为原文中的CompilationUnit(javaElement)是org.eclipse.jdt.internal.core包里
          //的,而用ASTparser解析源代码生成的CompilationUnit是org.eclipse.jdt.core.dom
          //包里的,两者是不同的,所以应该有不同的获取父类的方法。

          ASTParser parser = ASTParser.newParser(AST.JLS3);
          parser.setKind(ASTParser.K_COMPILATION_UNIT);
          parser.setSource(stringSource.toCharArray());
          CompilationUnit node = (CompilationUnit) parser.createAST(null);
          Type type = ((org.eclipse.jdt.core.dom.TypeDeclaration)node.types().get(0)).getSuperclassType();//这样可以拿到父类的类型

          1. 其实我是想找所有继承的父类,包括父类的父类。。。但是还是非常感谢你的帮忙,我再找找看吧。

          2. 如果你在Eclipse Runtime环境下可以用JavaCore.create(IResource)方法创建IJavaElement,然后用原文的方法。其他的我就不太清楚了。

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据