作者:江南白衣
Groovy的Team Leader-- Guillaume Laforge說,MOP(Meta Object Protocol)是他最喜歡的Groovy特性。
MOP是對屬性、方法進行攔截解釋的簡單機制,intercept 已經因為AOP而被大家熟悉。
Groovy的類都繼承于GroovyObject,GroovyObject有get/setProperty()和invokeMethod()兩個函數,當客戶調用不存在的屬性和方法時,就會交由這兩個函數來處理,在Ruby里,這個方法被更貼切的命名為method_missing()。Groovy類可以通過重載這兩個函數,加入自己的hook和behavior,比Java簡單的多的實現Proxy和Delegator。
println node.book.writer.text()
Groovy的Team Leader-- Guillaume Laforge說,MOP(Meta Object Protocol)是他最喜歡的Groovy特性。
MOP是對屬性、方法進行攔截解釋的簡單機制,intercept 已經因為AOP而被大家熟悉。
Groovy的類都繼承于GroovyObject,GroovyObject有get/setProperty()和invokeMethod()兩個函數,當客戶調用不存在的屬性和方法時,就會交由這兩個函數來處理,在Ruby里,這個方法被更貼切的命名為method_missing()。Groovy類可以通過重載這兩個函數,加入自己的hook和behavior,比Java簡單的多的實現Proxy和Delegator。
而更重要的是,MOP函數可以充當領域語言解釋者的角色,攔截一些存在于領域語言的而在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類當然沒有book,writer這樣屬于領域語言的屬性,但通過重載getPropety(String name)函數,node類可以把對book,writer屬性的訪問,轉換成相應DOM節(jié)點的訪問。
實現請參看org.codehaus.groovy.sandbox.util.XMLList類的public Object getProperty(final String elementName)函數。
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