【发布时间】:2016-07-29 15:47:02
【问题描述】:
我正在尝试使用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
【问题讨论】:
-
请看stackoverflow.com/questions/6222278/…和stackoverflow.com/questions/31938551/…两件事:1.您需要匹配要替换的方法的确切签名,2.根据您的Groovy版本,它可能是无法替换私有方法。
-
@CptBartender 1. 我已经匹配了确切的签名(没有参数); 2. 我使用的是最新版本 2.4.6。
-
@CptBartender 关于私有方法,可见性无关紧要,无论我设置什么可见性都不起作用。
-
@CptBartender 我发誓我尝试过公开曝光。我又试了一次,现在可以了。如果你写一个答案,我会接受。