2009-05-20 73 views
1

我很好奇開放類或猴子補丁等功能的用法, Ruby,Python,Groovy等。此功能允許您在運行時對現有類或對象進行修改(如添加或替換方法)。做任何「主要」框架使用猴子補丁/公開類

有誰知道主要框架(如Rails/Grails/Zope)是否(廣泛地)使用這個機會來爲開發人員提供服務?如果是這樣,請舉例說明。

回答

8

Rails對(恕我直言)的荒謬程度這樣做。

2

.Net允許通過擴展方法。

Linq,特別是,很大程度上依賴於擴展方法monkey-patched到IEnumerable接口。

+0

我知道,但這不是我在這裏問的。 – Eyvind 2009-05-20 12:54:06

1

在Java平臺上使用它的一個例子(自從您提到Groovy以來)就是使用AspectJ和JVM工具進行加載時編織。但是,在這種情況下,您可以選擇使用編譯時編織。有趣的是,我最近的一個SO問題與使用這種加載時織造的問題有關,一些人建議編譯時間是唯一可靠的選擇。

使用加載時(運行時)編織爲開發人員提供有用服務的AspectJ示例可以是Spring的@Configuration註釋,它允許您在沒有被Spring的BeanFactory實例化的對象上使用依賴注入。

你特別提到了修改方法(或者它是如何工作的),並且使用的一個例子是在發送到處理程序之前攔截http請求的一個方面(一些Controller方法或doPost等)並檢查查看用戶是否有權訪問該資源。然後,您的方面可能會決定返回 - 提前返回 - 重定向到登錄的響應。雖然沒有修改方法本身的內容,但您仍在修改方法的工作方式,我改變了返回值的方式。