作者:江南白衣    

    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簡單的多的實現ProxyDelegator。

    而更重要的是,MOP函數可以充當領域語言解釋者的角色,攔截一些存在于領域語言的而在Class里根本沒有定義的屬性、方法來進行解釋,這就是Groovy里XML嵌入式語法的魔法根源
    IBM DW有一篇專門的文章 :《PRACTICALLY mini-languages and MOPs Of Groovy:》
     比如如下的xml

 <shop>
   
<book name="foo">
     
<writer>莊表偉writer>
   
book>
 
shop>

    可以用groovy這樣訪問

    println node.book.writer.text()

     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.