Groovy 替换/重写的无参数方法的结果未传递给构造函数

Groovy 替换/重写的无参数方法的结果未传递给构造函数,groovy,expandometaclass,Groovy,Expandometaclass,我试图通过替换groovy类中用于设置属性的方法来改变groovy类的构造函数的行为,但是这些属性没有被设置为预期值 class TestClass { def noParam def withParam TestClass() { noParam = noParam() withParam = withParam('second test') } def noParam() { return 'fir

我试图通过替换groovy类中用于设置属性的方法来改变groovy类的构造函数的行为,但是这些属性没有被设置为预期值

class TestClass {

    def noParam
    def withParam

    TestClass() {
        noParam = noParam()
        withParam = withParam('second test')
    }

    def noParam() {
        return 'first test'
    }

    def withParam(param) {
        return param
    }

}

TestClass.metaClass.withParam =  { param -> 'pass' }
TestClass.metaClass.noParam = {-> 'pass' }

def test = new TestClass()

assert test.withParam('dummy') == 'pass' //passes
assert test.withParam == 'pass' // fails
assert test.noParam() == 'pass' // passes
assert test.noParam == 'pass' // fails

Groovy在执行
noParam
withParam
方法时,没有在TestClass构造函数中使用元类重写。事实上,如果在
withParam
方法中键入参数,第二次断言也将失败

class TestClass {

    def noParam
    def withParam

    TestClass() {
        noParam = noParam()
        withParam = withParam('second test')
        println "in the constructor: noParam = $noParam, withParam = $withParam"
    }

    def noParam() {
        return 'first test'
    }

    def withParam(String param) {
        return param
    }
}

TestClass.metaClass.withParam = { String param -> 'pass' }
TestClass.metaClass.noParam = {-> 'pass' }

def test = new TestClass()

assert test.withParam('dummy') == 'pass'
assert test.withParam  == 'pass' // this fails now too!
assert test.noParam() == 'pass'
assert test.noParam == 'pass' // this fails
以下是输出:
在构造函数中:noParam=first test,withParam=second test

test.withParam
test.noParam
实际上正在调用
test.getWithParam()
test.getNoParam()
-它们正在返回构造函数中设置的属性值

test.withParam('dummy')
test.noParam()
正在调用您的元类方法并返回“pass”

至于groovy为什么不在构造函数中使用元类方法,我不确定。。。我在…里找不到任何东西

也许你可以用静态方法代替

class TestClass {

    def noParam
    def withParam

    TestClass() {
        noParam = TestClass.noParam()
        withParam = TestClass.withParam('second test')
        println "in the constructor: noParam = $noParam, withParam = $withParam"
    }

    static def noParam() {
        return 'first test'
    }

    static def withParam(String param) {
        return param
    }
}

TestClass.metaClass.'static'.withParam = { String param -> 'pass' }
TestClass.metaClass.'static'.noParam = {-> 'pass' }

def test = new TestClass()

assert test.withParam('dummy') == 'pass'
assert test.withParam  == 'pass' // passes!
assert test.noParam() == 'pass'
assert test.noParam == 'pass' // passes!

以下是输出:
在构造函数中:noParam=pass,withParam=pass

我认为这与groovy生成有关,因为
noParam()
是一个接收
对象作为参数的方法。