元類上的方法調用,並混入有自己的處理程序時看。 兩者都是延遲加載的,而靜態的,如果你不調用一個方法,靜態延遲加載不會發生。
Mixins優先於metaClass覆蓋,這就是爲什麼它顯示foo並且如果初始化A而不會獲勝。
meta定義在它所應用的對象上,以便按需要解析它。Object.class .metaClass(即這裏B.metaClass)。 有趣的是這產生了:
groovy.lang.MissingMethodException: No signature of method: B.foo() is applicable for argument types:() values: []
Possible solutions: foo(), foo(java.lang.Object), bar(), any(), use([Ljava.lang.Object;), find(groovy.lang.Closure)
第B定義FOO解決錯誤:
class B extends A {
def foo() { println 'not winning' }
}
你的答案是的Mixin影響類metastore,和類方法優先對象metastore方法。
證明:
@Mixin(M)
class B extends A {
}
a.bar() //<-- comment out this line and see the difference
B.metaClass.foo = {println 'class winning'}
b.metaClass.foo = {println 'object winning'}
b.bar()
產量:
foo
class winning
一種不同的方法
class M {
protected foo() { println 'foo' }
}
@Mixin(M) class A {
def bar() { foo() }
}
class B extends A {
def bar() { foo() }
}
class C extends B {
def foo() { println 'wat' }
}
@Mixin(M)
class D extends C { }
def b = new B()
def a = new A()
def c = new C()
def d = new D()
a.bar() //<-- comment out this line and see the difference
b.metaClass.foo = {println 'winning'}
b.bar()
c.metaClass.foo = {println 'losing'}
c.bar()
d.metaClass.foo = {println 'draw'}
d.bar()
息率
foo
winning
wat
wat
我也可以在Groovy 1.8.4中重現這一點。聞起來像一個臭蟲給我;但我並不太在意Groovy元編程,所以我不知道。 – epidemian 2012-03-01 22:55:08
感謝您的注意事項,如果我最終提出了一個錯誤,我一定會加入。 – mfollett 2012-03-01 23:27:00
我在groovy用戶郵件列表上問這個,聞起來像是一個bug ... – 2012-03-01 23:47:35