作者:江南白衣
Groovy的Team Leader-- Guillaume Laforge說,MOP(Meta Object Protocol)是他最喜歡的Groovy特性。
MOP是對屬性、方法進行攔截解釋的簡單機制,intercept 已經(jīng)因為AOP而被大家熟悉。
Groovy的類都繼承于GroovyObject,GroovyObject有g(shù)et/setProperty()和invokeMethod()兩個函數(shù),當(dāng)客戶調(diào)用不存在的屬性和方法時,就會交由這兩個函數(shù)來處理,在Ruby里,這個方法被更貼切的命名為method_missing()。Groovy類可以通過重載這兩個函數(shù),加入自己的hook和behavior,比Java簡單的多的實現(xiàn)Proxy和Delegator。
println node.book.writer.text()
Groovy的Team Leader-- Guillaume Laforge說,MOP(Meta Object Protocol)是他最喜歡的Groovy特性。
MOP是對屬性、方法進行攔截解釋的簡單機制,intercept 已經(jīng)因為AOP而被大家熟悉。
Groovy的類都繼承于GroovyObject,GroovyObject有g(shù)et/setProperty()和invokeMethod()兩個函數(shù),當(dāng)客戶調(diào)用不存在的屬性和方法時,就會交由這兩個函數(shù)來處理,在Ruby里,這個方法被更貼切的命名為method_missing()。Groovy類可以通過重載這兩個函數(shù),加入自己的hook和behavior,比Java簡單的多的實現(xiàn)Proxy和Delegator。
而更重要的是,MOP函數(shù)可以充當(dāng)領(lǐng)域語言解釋者的角色,攔截一些存在于領(lǐng)域語言的而在Class里根本沒有定義的屬性、方法來進行解釋,這就是Groovy里XML嵌入式語法的魔法根源。
IBM DW有一篇專門的文章 :《PRACTICALLY mini-languages and MOPs Of Groovy:》
比如如下的xml
<shop>
<book name="foo">
<writer>莊表偉< SPAN>writer>
< SPAN>book>
< SPAN>shop>
<book name="foo">
<writer>莊表偉< SPAN>writer>
< SPAN>book>
< SPAN>shop>
可以用groovy這樣訪問

node類當(dāng)然沒有book,writer這樣屬于領(lǐng)域語言的屬性,但通過重載getPropety(String name)函數(shù),node類可以把對book,writer屬性的訪問,轉(zhuǎn)換成相應(yīng)DOM節(jié)點的訪問。
實現(xiàn)請參看org.codehaus.groovy.sandbox.util.XMLList類的public Object getProperty(final String elementName)函數(shù)。
Guillaume Laforge說,It's an aspect of Groovy which makes the language very powerful, but rare are those who really know and use it.
界面很漂亮的說。
http://www.ibm.com/developerworks/java/library/j-pg09205/index.html