2012-04-12 56 views
4

我有一個java對象的實例,比方說一個名爲myList的ArrayList實例。Groovy - 覆蓋單個實例的invokeMethod

對於這個特定的實例,我想覆蓋invokeMethod方法(稱爲)記錄該方法被調用。

我可以做這樣的事情:

myList.metaclass.invokeMethod { name, args -> 

    println "Called ${name} with ${args}" 
    whatGoesHere.invokeMethod(name, args) 

} 

通知關閉2號線 - 我怎麼能叫原invokeMethod中的方法?我正確地處理這個問題嗎?

+0

類似這樣的回答:找出一個方法的在Groovy名稱](http://stackoverflow.com/a/ 10113215/462015) – 2012-04-12 15:27:59

+0

Arturo,這個答案適用於整個班級,而不是單個實例。 – 2012-04-12 15:40:02

+0

我們可以用'ExpandoMetaClass'屬性以相同的方式向實例或類添加新行爲。 – 2012-04-12 16:32:48

回答

5

有可能是原來的方法更短的路線,但這應該工作:

def myList = [ 1, 2, 3 ] 

myList.metaClass.invokeMethod { name, args -> 
    println "Called ${name} with ${args}" 
    delegate.class.metaClass.getMetaMethod(name, args)?.invoke(delegate, args) 
} 

myList.sum() 
+0

我發現這在失敗的可變參數函數的情況下,該方法正在傳遞一個ArrayList。 'args'的類型爲Object [],並且ArrayList作爲一個元素...因此它與'getMetaMethod'成功匹配。我相信問題在於它無法將ArrayList強制到一個Object []中,所以它失敗時會出現'IllegalArgumentException:參數類型不匹配'。在我的情況下,解決方法是將某些類型從ArrayList切換到Object [],並且它正常工作。這將是一些工作,找出適當的'invokeMethod'修復將是什麼。 – brunobowden 2015-06-30 06:00:45

+0

更廣泛的回答這個處理可變參數:http://stackoverflow.com/a/31143363/1509221 – brunobowden 2015-07-02 01:36:08