2017-04-03 45 views
1

是否可以存儲來自不同常規腳本的閉包? 比方說,我有某種類的應該保存關閉:Groovy全球存儲不同腳本的閉包

package com.test 

class ClosureContainer { 
    static closures = [:] 

    static def AddClosure(String name, Closure cl) { 
     println "Adding closure named ${name}" 
     closures[name] = cl 
    } 
} 

然後我想有Groovy腳本,將添加關閉它:

import com.test.ClosureContainer as container 

container.AddClosure("Interesting stuff", { 
    println "I'm doing some interesting stuff" 
}) 

後來,我應該可以這樣稱呼它:

def closureCode = ClosureContainer.closures["Interesting stuff"] 
closureCode() 

什麼是在Groovy中實現它的最佳方法?我不知道如何處理調用腳本,因爲類是從這些腳本生成的。 我可以在運行時創建腳本的實例,但是我無法在不對其進行硬編碼的情況下檢索類/腳本的列表。

UPDATE:

讓我們假設我有testScript.groovy在增加了一些封閉的容器包裝com.test.scripts。我嘗試讓gradle從腳本生成類並在代碼中創建實例,如下所示:

def className = Class.forName("com.test.scripts.testScript") 
def instance = className.newInstance() 
instance.run() 

而且我正在對testScript名稱進行硬編碼。但是會有很多腳本,我應該能夠動態地檢索它。

+0

硬編碼是什麼意思?哪部分代碼是硬編碼的? – dsharew

+0

我更新了問題。 – Jaryn6909

+0

哦,我現在明白在這種情況下,你必須使用GroovyScriptEngine。 – dsharew

回答

0

推薦的方式來運行Groovy腳本是用GroovyScriptEngine

String[] path = new String[] { "." }; 
GroovyScriptEngine engine = new GroovyScriptEngine(path); 
engine.run("yoursriptname.groovy", new Binding()) 

注:yoursriptname應該是腳本相對於path你的路徑。

如果你想傳遞綁定(參數,然後得到結果),你必須使用Binding

+0

這是否解決了通過運行多個腳本在全局範圍內存儲閉包的問題? – pczeus

+0

我想我可以與之合作,所以非常感謝回覆。 – Jaryn6909

+0

NP。沒關係 – dsharew