在调试Grails应用程序时,我发现Groovy的行为似乎有点奇怪。让我们说我想在String
类中添加一些方法:
String.metaClass.myMethod = {
println 'Hello'
}
然后我尝试使用getMetaMethods()
获取元方法列表,但它不包含此方法。我知道那里的getExpandoMethods()
工作正常但是不应该将类添加到类中的元方法也包含在metaMethods
列表中吗?特别是当getMetaMethod()
按预期工作时。代码如下:
def emptyArray = new Object[0];
assert String.metaClass.getMetaMethods().collect { it.name }.contains('myMethod') == false
assert String.metaClass.getMetaMethod('myMethod', emptyArray) != null
// and again with instance
def text2 = 'Just for testing...'
assert text2.metaClass.getMetaMethods().collect { it.name }.contains('myMethod') == false
assert text2.metaClass.getMetaMethod('myMethod', emptyArray) != null
如果我之前尝试使用expando方法,这就更奇怪了:
def text = 'Again just for testing...'
text.metaClass.getExpandoMethods() // strange, but let's try...
assert text.metaClass.getMetaMethods().collect { it.name }.contains('myMethod') == true
assert text.metaClass.getMetaMethod('myMethod', emptyArray) != null
使用Groovy 2.3.6和2.2.2进行测试。
有什么想法吗?提前谢谢!