2015-07-04 38 views
3

在TCL中,可以在運行時獲取方法/過程的代碼,修改它並將其注入。Groovy元編程

這可能在Groovy中嗎?我知道有可能包裝原始方法,但我(不幸地)猜測,在groovy中,方法的來源在運行時不可用,是嗎?

例如:想象一下以下的(不太好)〔實施例

def someMethod() { 
    //some complex code I don't have the source 
    println "debug" 
    //some more complex code 
} 

如果我現在想改變println聲明爲log聲明。我無法替換整個方法,因爲我沒有源代碼,或者不想冒着在下一個版本中不同的風險,因此我會用舊的代碼覆蓋它。

對Jayan的感謝我現在意識到這可能是通過AST轉換來處理的,但是在我看來,它似乎比它應該更復雜。

如果我能打通元編程的源和修改...

行 - 我已經聽到人們說我需要一個解析器來修改它,這就是正是AST給我 - 已解析的代碼。但說實話,我認爲源代碼上的一個簡單的正則表達式通常已經足夠了;-)

+0

您是否檢查過:http://stackoverflow.com/questions/2444907/is-it-possible-to-replace-groovy-method-for-existing-object – Jayan

+0

另一個相關資源:http://www.slideshare .net/ilopmar/metaprogramming-with-groovy – Jayan

+0

@Jayan Thanx。這些資源只顯示AST可用於元編程,而不是源。但是,如果有可能將AST轉換回源,請修改並注入它。 – rdmueller

回答

2

首先澄清事情: 運行時元編程意味着有一個自修改程序。它在運行時會自行改變。這通常通過修改元類完成。 Compiletime Metaprogramming意味着通過「擴展」編譯器來修改程序運行之前。通常後者是通過AST轉換完成的。

Groovy將字節碼提供給JVM執行。可能有也可能沒有可用的源文件,但通常沒有運行時結構,它保留了源代碼。有一個從元類到AST的映射,但是這基本上是在類路徑上搜索一個合適的源文件,並從中編譯一個AST。如果來源不適用於您,則無法使用。

即使源代碼可用,這也不會爲您提供所需的修改功能。需要編譯一個新類,然後使用hotswapping等類來替換類。

Groovy不是像Smalltalk這樣的圖像系統。

+0

Thanx!我想這是我正在尋找的答案。當我問這個問題時,沒有想到運行時和編譯時間之間的區別... – rdmueller