2012-02-09 18 views
1

如何替換現有java類的方法(在我的情況下爲GrailsDataBinder)。 我讀的方法調用java類不通過invokeMethod,因此它不起作用,但我認爲會有一些解決方案。Groovy - 如何替換現有Java類的方法

我只是嘗試這樣做

GrailsDataBinder.metaClass.static.createBinder = {Object target, String objectName -> 
    throw new RuntimeException() 
} 

GrailsDataBinder.class.metaClass.static.createBinder = {Object target, String 
    objectName -> throw new RuntimeException() 
} 

但是,這似乎並沒有已經取代了方法,因爲不被調用我的關閉,而是原始的方法執行。

更新

我發現,如果我把從測試類本身的createBinder正在執行關閉 - 所以它的工作原理,當它被調用的方法替換

void testDataBinder() { 
    GrailsDataBinder.createBinder(null, null) 
} 

然而從DataBindingUtils,它始終執行原始方法(DataBindingUtils也是一個Java類)

以下是調用方法的DataBindingUtils中的代碼。

binder = GrailsDataBinder.createBinder(object, object.getClass().getName()); 

注意:前面提到了一些類似的問題,但他們都沒有爲我工作。

+0

從Groovy調用DataBindingUtils的調用?需要Groovy運行時才能獲取元類更改。如果您將Groovy集成到Java中,並且調用來自Java,那麼它將不會看到已修補的更改。 – 2012-02-09 17:43:07

+0

是的,對DataBindingUtils的調用是通過BindDynamicMethod進行的,它從一個groovy類中調用。我也試着直接從Grails單元測試用例中調用DataBindingUtils。 – 2012-02-10 04:04:58

回答

1

一旦你看到Groovy的力量,這是令人失望的。但是,正如您已經知道的那樣,許多Groovy中可用的酷元類等功能根本無法像Java類那樣工作。

如果你想覆蓋Java類的單元測試等等,我建議尋找Spock,因爲它使用實際上也適用於Java類的'魔術'。

如果您嘗試重寫某些其他原因的方法,您應該嘗試使用Groovy類擴展Java類或使用Groovy類「包裝」Java類以獲得外部類調用您所需的元類功能類方法。不幸的是,這仍然不允許你攔截Java類自己調用的調用。