我正在开发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;
}
}
我正在访问项目中的每个 class 。基本上,在扩展
oldType
的类中,我想将其更改为newType
。但是,条件superClass.equals(oldType)
永远不会为真,因为我的oldType
字符串是点分隔的完全限定名称,而node.getSuperclassType()
仅返回类的名称。是否可以找出超类的全名?
供参考,此答案帮助我创建了此访客:
How Can a SuperClass name be retrieved from a java file using ASTParser?
最佳答案
我可能误解了这个问题,但是...
我的oldType字符串是一个以点分隔的全限定名,而node.getSuperclassType()仅返回类的名称。
错了您的代码显示为:
public Type superClass;
<...>
SimpleType oldType = <...>
也不是
Type
,也不是SimpleType
子类String
。他们不是名字。它们是完全合格的类,具有有关类型的信息。他们不测试均等的原因是在Javadoc上的Type.equals
上写的:public final boolean equals(Object obj)
此Object方法的ASTNode实现使用对象标识(==)。使用subtreeMatch比较两个子树是否相等。
后者也提供了在哪里寻找合适的平等测试人员的指示。至于为什么节点使用不同的名称-
toString
上的Type
说得很清楚返回此节点的字符串表示形式,仅适用于调试目的。
因此您不能将其用于任何决策。
我想您会混合
getName
和toString
来获得该结果,因为getName
没有为Type
定义,而是为SimpleType
定义,尽管那部分代码丢失了,所以我只是在推测。关于java - JDT如何知道父类(super class)的全名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23766576/