groovy探索之mop 十二 方法的呼叫順序
我們知道,除了使用hook來攔截方法以外,我們還可以通過各種方式來實現方法。如,我們可以在類裡直接實現方法;我們可以通過expandometaclass在執行期內新增方法;我們還可以通過expandometaclass在執行期內單獨給乙個物件新增方法。
所有的這些直接新增方法的途徑,如果存在hook的話,都是要被hook攔截的。所以,我們可以說,系統是優先呼叫hook的。
本篇要談到,卻是除了hook方法以外的方法實現途徑的呼叫順序的問題。
我們都知道,如果有如下的乙個類:
classfoo
那麼,我們可以通過如下的方法來呼叫它的方法:
deffoo =newfoo()
printlnfoo.foo
執行結果為:
foo這就是我們的gpath。
當然,我們也可以通過expandometaclass在執行期內新增這個"get"方法,如下:
foo.metaclass.getfoo =
如果我們再做下面的測試:
deffoo =newfoo()
printlnfoo.foo
那麼,執行結果為:
meta
從結果可以看出,在執行期內通過expandometaclass新增的方法是會覆蓋類本身的方法的。
我們知道,在執行期內給類新增方法還有一種方式,即:
defmc =newexpandometaclass(foo.class,true)
mc.getfoo =
mc.initialize()
下面,我將對上面的foo類,在執行期內同時實行上面的兩種方法的新增方式,然後在做測試,看看結果將會如何?
**如下:
foo.metaclass.getfoo =
defmc =newexpandometaclass(foo.class,true)
mc.getfoo =
mc.initialize()
deffoo =newfoo()
printlnfoo.foo
}執行結果為:
far由此可見,後一種在執行期內新增方法的方式是會覆蓋前一種在執行期內新增方法的方式的。
除此之外,我們還有一種在執行期內給物件新增方法的方式,如下:
defemc =newexpandometaclass( foo.class,false)
emc.getfoo =
emc.initialize()
foo.metaclass = emc
最後,我們還將寫**來測試這最後一種方式與前幾種方式的呼叫順序。**如下:
defmc =newexpandometaclass(foo.class,true)
mc.getfoo =
mc.initialize()
deffoo =newfoo()
defemc =newexpandometaclass( foo.class,false)
emc.getfoo =
emc.initialize()
foo.metaclass = emc
printlnfoo.foo
執行結果為:
test
可以看出,使用上面的方式在執行期內給乙個物件新增的方法,會覆蓋通過expandometaclass在執行期內給乙個類新增的方法。
GINA之Groovy的MOP動態特性
gina groovy in action groovy中metaclass在其動態特性中有著舉足輕重的作用,uml類圖如下 img gia中groovy方法呼叫描述如下 list 1 呼叫當前類的invokemethod方法實現 當然也可能是 傳遞給metaclass 呼叫getmetaclass...
Groovy探索之Builder 二
groovy探索之builder 二 在前面的部分,我以 markupbuilder為例介紹了如何使用builder,通過它,我們可以看過了dsl程式設計的威力。當然了,既然看到了builder功能的強大,我們就忍不住想自己建立乙個builder,來構建我們自己的dsl程式設計。在groovy語言中...
Groovy探索之責任鏈模式
groovy探索之責任鏈模式 責任鏈模式在現實中也有很多對應的例項。比方說,乙個公司有a,b,c,d四個專案組,各自相鄰。一天,乙個客戶打 進來,說我們某某專案出了點問題,請幫忙解決。是由a專案組的人接的,a專案組的人一聽,說這不是我們負責的專案,我們把它交給b專案組吧。b專案組的人一聽,也說,這也...