问题描述
我正在尝试执行以下代码。
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
引用的类型元素。