Groovy   发布时间:2022-04-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在Groovy的NodeChild上添加动态方法的奇怪行为大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_673_0@
@H_673_0@
我正在使用Grails XML Parser解析XML字符串,在获得解析后的NodeChild实例后,我在该实例上添加了动态方法,如下所示:

import grails.converters.XML
import groovy.util.slurpersupport.NodeChild

NodeChild result = XMl.parse("<root></root>")

result.getMetaClass().methodA = { return "a" }
result.getMetaClass().methodB = { return "b" }

println rootNode.methodA()
println rootNode.methodB()

现在,我正在@L_528_5@methodA()并期望打印“a”的行,我得到MissingMethodException,找不到methodA().

对此进行了一段时间的调查,发现所有动态方法都被我们添加的最后一个动态方法所取代,即在这种情况下:methodB()正在替换(或做某事)methodA(),所以我称之为&首先打印methodB(),正确打印“b”.

这让我想到另一个测试如下:

import grails.converters.XML
import groovy.util.slurpersupport.NodeChild

String result = "any-other-data-type-instance-here-to-inject-dynamic-methods"

result.getMetaClass().methodA = { return "a" }
result.getMetaClass().methodB = { return "b" }

println rootNode.methodA()
println rootNode.methodB()

在这种情况下,两个语句打印都很好.所以问题只在于classnodeChild.我长时间使用exando元类功能,我遇到了这样的问题.任何想法,为什么会发生这种情况?

解决方法

您需要在返回实例之前分配元类方法,否则它将具有旧的元类,而不是具有新方法的新元类.另外,分配给类,而不是实例 – 我不确定你是否只想影响这个实例的元类,但这不是语法.

这有效:

import grails.converters.XML
import groovy.util.slurpersupport.NodeChild

NodeChild.MetaClass.methodA = { return "a" }
NodeChild.MetaClass.methodB = { return "b" }

NodeChild result = XMl.parse("<root></root>")

println result.methodA()
println result.methodB()

请注意,您使用隐式it参数定义方法,但不传递任何内容,因此Groovy传递null.如果您打算让方法没有参数,请使用以下语法:

NodeChild.MetaClass.methodA = { -> return "a" }
NodeChild.MetaClass.methodB = { -> return "b" }
@H_673_0@

大佬总结

以上是大佬教程为你收集整理的在Groovy的NodeChild上添加动态方法的奇怪行为全部内容,希望文章能够帮你解决在Groovy的NodeChild上添加动态方法的奇怪行为所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:groovy动态奇怪方法添加行为
猜你在找的Groovy相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap