2012-01-13 76 views
3

我正在學習groovy,並且我有一個關於它的元編程設施的問題。據我所知,groovy中的每個對象實現了groovy.lang.GroovyObject接口(由groovy編譯器隱式添加)。後者接口包含的方法getMetaClass(),所以我可以做到以下幾點:groovy中的java類的metaClass屬性

class MyGroovyClass{ 
} 
def myGroovyClass = new MyGroovyClass(); 
println myGroovyClass.metaClass.name 

,我不明白的是由Java編譯器像java.lang.String中編譯對象,如何獲取元類屬性的東西。這個屬性是否在通過MetaClassRegistry與Java類相關的實際MetaClass對象中定義?

回答

3

除了通過元對象協議添加的方法之外,Groovy還使用groovy.runtime.DefaultGroovyMethods類中定義的其他方法來擴充JDK中的類。 List和其他收集方法可以使用如eachcollect。相同的機制將getMetaClass方法添加到java.lang.Object

+0

好的,但是如何在groovy.runtime.DefaultGroovyMethods中定義的這些方法被調用? groovy編譯器是否顯式查找對jdk類的方法調用並攔截這些以生成調用DefaultGroovyMethods中定義的方法的字節碼?這是否意味着只有在jdk中定義的java類才能獲得getMetaClass()方法? – 2012-01-14 00:25:08

+0

@ JamesV.H。那麼,Groovy對象顯然擁有這個屬性 - 「獲得方法」是什麼意思? – 2012-01-14 00:34:05

+1

@DaveNewton是的我明白在groovy中編譯的對象具有屬性,在那裏沒有問題。用java編譯器編譯的類顯然沒有屬性,我們仍然可以調用它們的metaClass屬性。 Ataylor評論了添加方法的定義(在DefaultGroovyMehods中),而不是關聯機制如何工作。 – 2012-01-14 01:25:17

1

正確,POJO在註冊表中查找它們的元類。

This presentation提供Groovy和POJ對象如何使用元類的高級概述。 (注意它有點老了)。

+1

鏈接已損壞:S – Hilikus 2016-11-17 21:31:48