API 函数 `replace` 不会用 CtClass 实例替换 class

API function `replace` doesn't replace a class with a CtClass instance

我正在尝试执行以下代码。

System.out.println(originalElement);
System.out.println(uniqueParent);
((CtClass) originalElement).replace((CtClass) uniqueParent);

哪里

originalElement

class Already {}

并且uniqueParent

class Already {
    class Klass {}
}

但是,当我尝试用 uniqueParent 替换 originalElement 时,它不起作用。我已经尝试用 CtMethod 等其他元素替换 API 并且它可以在那里工作。我想知道这是 CtClass 的预期行为还是应该是一个错误?

总结一下 Spoon forum 上的讨论,这里的问题涉及 CtElement.replace 的语义。意思不是调用目标呈现与其参数相同的状态。这意味着过去包含调用目标对象作为节点的 AST 模型现在包含参数对象作为替代。

当您在 CtMethod 上使用 replace 时,您可能会检查父元素(例如 CtClass 而不是 CtMethod 本身的更改。同样,您可以在替换后使用 originalElement.getParent() 来获取当前模型的一部分来检查更改。在这种情况下,它将 return 一个 CtPackage 具有由 uniqueParent 而不是 originalElement.

引用的类型元素