无法替换静态方法

时间:2016-04-08 11:36:10

标签: groovy metaclass

我尝试使用MetaClass在运行时替换静态方法。

class MyClass {
    private static String getString() {
        'Hello'
    }

    String testString

    MyClass() {
        testString = getString()
    }
}

MyClass.metaClass.static.getString = { ->
    'Hello world!'
}

def test = new MyClass()
assert test.testString == 'Hello world!'

然而,这并不起作用。

Caught: Assertion failed: 

assert test.testString == 'Hello world!'
       |    |          |
       |    Hello      false
       MyClass@5876a9af

1 个答案:

答案 0 :(得分:3)

由于bug in Groovy 2.4.3,无法通过元类更改私有方法。我已经将方法更改为public(嗯,默认)并且还更改了构造函数,以便它显式调用它的类'getString方法,现在它似乎在Groovy web console

中工作

编辑后的完整代码:

class MyClass {
    static String getString() {
        'Hello'
    }
    String testString
    MyClass() {
        testString = MyClass.getString()
    }
}
MyClass.metaClass.static.getString = {'Hello world!'}
def test = new MyClass()
assert test.testString == 'Hello world!'