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