Expando Metaclass行为取决于类是否是用户定义的?

时间:2014-06-04 14:08:00

标签: groovy expandometaclass

在尝试使用ExpandMetaClass时,我遇到了这种情况:

class A {}

A.metaClass.foo = { 0 }
A.metaClass.foo = { 1 }
println (new A().foo())
A.metaClass.foo = { 2 }
println (new A().foo())

Collection.metaClass.foo = { 0 }
Collection.metaClass.foo = { 1 }
println ([].foo())
Collection.metaClass.foo = { 2 }
println ([].foo())

打印

1
2
1
1

这似乎不一致。这种行为背后的理由是什么?

1 个答案:

答案 0 :(得分:2)

听起来像个臭虫。您应填写JIRA

它适用于每个实例:

class A {}

A.metaClass.foo = { 0 }
A.metaClass.foo = { 1 }
assert (new A().foo()) == 1
A.metaClass.foo = { 2 }
assert (new A().foo()) == 2

Collection.metaClass.foo = { 0 }
Collection.metaClass.foo = { 1 }
assert ([].foo()) == 1

def j = []
j.getMetaClass().foo = { 2 }
assert (j.foo()) == 2