我注意到Groovy MetaClass有一些奇怪的行为,我想知道是否有人能给我一个线索,告诉我这里发生了什么.
这很好用:
@Override
Object invokeMethod(String name, Object args) {
if(true) {
println("Should only see this once")
def impl = { Object theArgs -> println("Firing WeirdAction") }
getMetaClass()."$name" = impl
return impl(args)
}
}
但是,如果我取消if语句,它会抛出一个MissingPropertyException:
@Override
Object invokeMethod(String name, Object args) {
println("Should only see this once")
def impl = { Object theArgs -> println("Firing WeirdAction") }
getMetaClass()."$name" = impl
return impl(args)
}
这是我的类实例化和调用,除了上面的方法定义之外,该类是空的.
IfTester sut = new IfTester()
sut.WeirdAction()
任何人都知道我在这里误会了什么?
最佳答案 使用Groovy 2.4.5,问题似乎与getMetaClass()和IfTester.getMetaClass()有关.考虑:
class IfTester {
@Override
Object invokeMethod(String name, Object args) {
if (true) {
println "Should only see this once"
def impl = { def theArgs -> println "Firing WeirdAction" }
def mc1 = getMetaClass()
println "mc1: " + mc1
println "----"
def mc2 = IfTester.getMetaClass()
println "mc2: " + mc2
IfTester.getMetaClass()."$name" = impl
return impl(args)
}
}
}
IfTester sut = new IfTester()
sut.WeirdAction()
使用if(true),则mc1和mc2相同,两者都有效.没有if,mc1是不同的,并且使用该样式会导致错误.
我不知道根本原因,也不知道它是不是一个bug.不知何故,似乎存在一个范围问题,或者在这种情况下这种感觉是不同的.