无法从实例中使用metaClass向Groovy动态添加方法

时间:2014-07-15 21:47:05

标签: groovy

我担心我是Groovy的初学者,所以这可能非常愚蠢。 (使用groovy 2.3.4) 我有以下代码:

class Test {

    public void method() {
        def methodName = "dynamicMethodName"
        this.metaClass."$methodName" = {->}
        this."${methodName}"()
    }
}

new Test().method()

运行此命令会抛出以下错误:

Caught: groovy.lang.MissingPropertyException: No such property: dynamicMethodName for class: groovy.lang.MetaClassImpl
    groovy.lang.MissingPropertyException: No such property: dynamicMethodName for class: groovy.lang.MetaClassImpl
at Test.method(what.groovy:5)
at Test$method.call(Unknown Source)
at what.run(what.groovy:10)

有人可以帮我弄清楚我做错了什么吗?我也试着不要过于活跃。并改变了代码:

class Test {

    public void method() {
        this.metaClass.dynamicMethodName = {->}
        this.dynamicMethodName()
    }
}

new Test().method()

但我仍然得到同样的错误

更新

似乎如果我通过使用实例引用而不是使用 this 在类外部添加方法,它就可以工作。

是否无法从实例本身动态添加实例的方法?

1 个答案:

答案 0 :(得分:1)

事实证明,如果类扩展了Expando类,它就可以工作。

在此处找到答案:https://stackoverflow.com/a/7079038/56242