API 函数`replace` 不会用 CtClass 实例替换一个类

问题描述

我正在尝试执行以下代码

    col
6   4.0
7   5.0
8   6.0

哪里

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

originalElement

class Already {}

uniqueParent

但是,当我尝试用 class Already { class Klass {} } 替换 originalElement 时,它不起作用。我已经尝试使用其他元素(例如 uniqueParent)替换 API,并且它在那里工作。我想知道这是 CtMethod 的预期行为还是应该是一个错误

解决方法

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

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