Groovy 无法替换静态方法

Groovy 无法替换静态方法,groovy,metaclass,Groovy,Metaclass,我试图在运行时使用元类替换静态方法 class MyClass { private static String getString() { 'Hello' } String testString MyClass() { testString = getString() } } MyClass.metaClass.static.getString = { -> 'Hello world!' } def t

我试图在运行时使用
元类
替换静态方法

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
由于存在错误,无法通过元类更改私有方法。我已经将该方法更改为public(嗯,默认值),并且还更改了构造函数,以便它显式地调用它的类“
getString
方法,现在它似乎在

编辑后的完整代码:

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!'
由于存在错误,无法通过元类更改私有方法。我已经将该方法更改为public(嗯,默认值),并且还更改了构造函数,以便它显式地调用它的类“
getString
方法,现在它似乎在

编辑后的完整代码:

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!'

可能的副本请看一看和两件事:1。您需要匹配要替换的方法的确切签名,2。根据Groovy版本的不同,可能无法替换私有方法。@CptBartender 1。我已经匹配了确切的签名(没有参数);2.我使用的是最新版本2.4.6。@CptBartender关于私有方法,可见性不重要,不管我设置了什么可见性,它都不起作用。@CptBartender我发誓我尝试过公共可见性。我又试了一次,现在成功了。如果你写一个答案,我会接受的。可能的副本请看一看和两件事:1。您需要匹配要替换的方法的确切签名,2。根据Groovy版本的不同,可能无法替换私有方法。@CptBartender 1。我已经匹配了确切的签名(没有参数);2.我使用的是最新版本2.4.6。@CptBartender关于私有方法,可见性不重要,不管我设置了什么可见性,它都不起作用。@CptBartender我发誓我尝试过公共可见性。我又试了一次,现在成功了。如果你写一个答案,我会接受的。为什么
testString=getString()
返回的结果与
testString=MyClass.getString()不一样?你知道为什么会有这种行为吗?不,不幸的是。我的猜测是,
getString()
直接调用该方法,而
MyClass.getString()
通过提供元类扩展的相同机制调用它(Groovy中不像Java中那样“直接”)。IIRC我曾经做过一个测试,在那里我不能使用来自Java类的元类扩展。也就是说,对于我的语言知识来说,这是一个太低级的问题,我不会太依赖这个答案。事实上,我发现这个问题的行为更加奇怪。我把这件事发出去了。我高度怀疑这是Groovy中的一个bug。为什么
testString=getString()
返回的结果与
testString=MyClass.getString()
返回的结果不同?你知道为什么会有这种行为吗?不,不幸的是。我的猜测是,
getString()
直接调用该方法,而
MyClass.getString()
通过提供元类扩展的相同机制调用它(Groovy中不像Java中那样“直接”)。IIRC我曾经做过一个测试,在那里我不能使用来自Java类的元类扩展。也就是说,对于我的语言知识来说,这是一个太低级的问题,我不会太依赖这个答案。事实上,我发现这个问题的行为更加奇怪。我把这件事发出去了。我高度怀疑这是Groovy中的一个bug。