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" }
以上是大佬教程为你收集整理的在Groovy的NodeChild上添加动态方法的奇怪行为全部内容,希望文章能够帮你解决在Groovy的NodeChild上添加动态方法的奇怪行为所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。