【问题标题】:JDT How to know the full name of a superclassJDT 如何知道超类的全名
【发布时间】:2017-03-16 14:07:39
【问题描述】:

我正在开发一个 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?

【问题讨论】:

  • 你的问题和标题有点矛盾,我觉得……
  • 谢谢,我会尽量说清楚的。
  • 对于任何非数组类,TheClassName.class.getName() 会将完整的点分隔名称作为字符串返回。 someObj.getClass().getName() 将返回对象的类名。 someObj.getClass().getSuperclass().getName() 将返回超类的名称。
  • 我不是在思考类,而是在使用编译单元。

标签: java eclipse-jdt


【解决方案1】:

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

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

这是错误的。您的代码如下:

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

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

公共最终布尔等于(对象 obj)
此 Object 方法的 ASTNode 实现使用对象标识 (==)。使用 subtreeMatch 比较两个子树是否相等。

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

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

因此您不能将其用于任何决策。
我想你混合了getNametoString 来得到这个结果,因为getName 没有为Type 定义,而是为SimpleType 定义的,尽管这部分代码丢失了,所以我只是推测。

【讨论】:

  • @JoãoGonçalves 你知道“你对所涉及的类和方法的理解是完全错误的,请详细阅读(相当简单的)Javadoc”的说法,同时提供答案,而不是屈尊俯就吗?
  • @JoãoGonçalves 荒谬,我当然不是说 OP 很愚蠢。相反,我怀疑我回答的问题实际上是 OP 所要求的。答案太长,无法放入评论中,这在这些情况下很常见。不过你是对的,我会删除可能有问题的部分。
  • 这并没有回答我的问题。我有一个超类的课程。我正在用一个字符串构造一个Type,我对此无能为力。我只是想知道是否可以获得超类的限定名称。我能找到的只是它的简单名称。
  • @ecc 这听起来像XY problem。无论哪种方式,您从未真正展示过如何从类型中获取名称,因此我无法说明为什么您会得到不同的名称。
  • 我可以试着解释一下,但我想我会发布另一个问题。
【解决方案2】:

我也面临同样的问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多