为什么这个元类只在构造函数执行后才修改值?

时间:2015-03-12 20:58:21

标签: groovy constructor metaclass

class EmailAssist {
    def abcService = "abc"
    String name

    EmailAssist(String name) {
        this.name = name
        println abcService
    }

    EmailAssist() {
    }

}

EmailAssist.metaClass.getAbcService = {->
    "test"
}

def e = new EmailAssist("Joe")
println e.abcService

这导致输出

abc
test

我认为这会导致

test
test

任何人都可以解释一下究竟是什么吗?元类只在构造函数执行后才会修改,而不是覆盖构造函数方法吗?

1 个答案:

答案 0 :(得分:1)

如果您在一个类(不是内部/嵌套类,不是开放块)中定义一个字段并使用限定或不合格的this访问该字段,那么直接完成访问而不考虑MOP 。因此,您无法以这种方式遮蔽字段。由于此逻辑由编译器和文字完成,而不是按值,您可以通过def tmp = this; tmp.abcService

绕过此