2010-04-30 30 views
6

我已經開始學習Groovy和我目前正在研究的元類的功能。我已經看到了添加新方法和刪除所有方法的示例,但沒有提到刪除單個方法。例如:刪除單個元類方法

String.metaClass.foo = {delegate.toUpperCase()} 
String.metaClass.bar = {delegate.toLowerCase()} 

具有明顯的副作用。現在我已經看到,你可以說

String.metaClass = null 

要刪除所有的方法。我希望人們可以說沿着

String.metaClass.foo = null 

線的東西刪除String.foo(),但有String.bar()保持,但這種說法似乎並沒有產生任何影響。有沒有辦法說方法foo()不應該再定義,而不會影響巴()或任何其他附加的方法呢?

回答

6

如果你搜索this webpage的「刪除方法」它說,你應該能夠刪除使用您在上面提出確切的語法的方法。但是我測試了一下,你說得對,它似乎並不奏效。

一種解決方法是指定一個封閉拋出MissingMethodException,這是在默認情況下會發生什麼,當你調用一個不存在的方法,例如

// Add method 
String.metaClass.foo = {delegate.toUpperCase()} 

// Remove method 
def removeMethod = {throw new MissingMethodException()} 
String.metaClass.foo = removeMethod 

無可否認,這不是最令人滿意的解決方案。