JDT如何知道超类的全名

时间:2014-05-20 17:45:46

标签: java eclipse-jdt

我正在开发一个Eclipse插件。我正在使用ASTVisitor的以下实现,以便在该类扩展第三个类时替换类的超类。

import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.Name;
import org.eclipse.jdt.core.dom.SimpleType;
import org.eclipse.jdt.core.dom.Type;
import org.eclipse.jdt.core.dom.TypeDeclaration;

public class SuperClassVisitor extends ASTVisitor{
    public Type     superClass;
    public String   newSuperClass;
    private String  oldSuperClass;


    public SuperClassVisitor(String newType, String oldType) {
        this.newSuperClass = newType;
        this.oldSuperClass = oldType;
    }

    public boolean visit(TypeDeclaration node) {
        superClass = node.getSuperclassType();
        if (newSuperClass != null) {
            Name oldName = node.getAST().newName(oldSuperClass);
            SimpleType oldType = node.getAST().newSimpleType(oldName);

            Name newName = node.getAST().newName(newSuperClass);
            SimpleType newType = node.getAST().newSimpleType(newName);

            if (superClass != null && superClass.equals(oldType)) {
                node.setSuperclassType(newType);                
            }
        }
        return true;
    }
}

我正在访问我项目中的每个班级。基本上,在扩展oldType的类中,我想将其更改为newType。但是,条件superClass.equals(oldType)永远不会成立,因为我的oldType字符串是以点分隔的完全限定名称,而node.getSuperclassType()只返回类的名称。

是否可以找到超类的全名?

作为参考,这个回答帮助我创建了这个访问者: How Can a SuperClass name be retrieved from a java file using ASTParser?

2 个答案:

答案 0 :(得分:4)

我可能误解了这个问题,但是......

  

我的oldType字符串是以点分隔的完全限定名称,而node.getSuperclassType()仅返回类的名称。

这是错误的。您的代码为:

public Type     superClass;
<...>
SimpleType oldType = <...>  

也不是Type,也不是SimpleType子类String。它们不是名字。它们是完全限定的类,包含有关类型的信息。他们不测试equals的原因写在Type.equals上的Javadoc:

  

public final boolean equals(Object obj)
  此Object方法的ASTNode实现使用对象标识(==)。使用subtreeMatch比较两个子树的相等性。

后者还说明了在哪里寻找合适的等式测试仪。至于为什么节点给出了不同的名称 - toString Type说得很清楚

  

返回此节点的字符串表示形式,仅适用于调试目的。

因此您无法将其用于任何决策 我想你混合了getNametoString来获得结果,因为getName没有为Type定义,而是为SimpleType定义,尽管那部分是{{1}}代码丢失了,所以我只是猜测。

答案 1 :(得分:0)

我面临同样的问题。

JDT似乎无法自动将SimpleType解析为QulifiedType。因此,我想首先解析import语句以获取导入的类型。 我也在寻找一个更简单的解决方案。