groovy invokeMethod添加方法到metaclass需要if语句?

时间:2016-08-25 19:51:18

标签: groovy metaclass

我注意到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()

任何人都知道我在这里误会了什么?

1 个答案:

答案 0 :(得分:1)

使用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)mc1mc2相同,两者都有效。如果没有ifmc1会有所不同,并且使用该样式会导致错误。

我不知道根本原因,也不知道它是否是一个错误。不知何故,似乎存在一个范围问题,或者this的意义在这种情况下是不同的。