2017-04-03 9 views
1

異なるgroovyスクリプトからクロージャを格納することは可能ですか? のは、私はクロージャを格納する必要があり、クラスのいくつかの種類があるとしましょう:異なるスクリプトからのクロージャのGroovyグローバル格納

package com.test 

class ClosureContainer { 
    static closures = [:] 

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

そして、私はそれにクロージャを追加するグルーヴィーなスクリプトがしたい:

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:

だが、私はコンテナにいくつかのクロージャを追加したパッケージcom.test.scriptsにtestScript.groovyを持っているとしましょう。

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

そして、私はにTestScript名をハードコーディングしています:私はGradleのスクリプトからクラスを生成し、このようなコードでインスタンスを作成してみましょうしようとしました。しかし、多くのスクリプトがあり、私はそれを動的に取得できるはずです。

+0

ハードコーディングはどういう意味ですか?あなたのコードのどの部分がハードコードされていますか? – dsharew

+0

私は質問を更新しました。 – Jaryn6909

+0

ああ、その場合、GroovyScriptEngineを使用する必要があることを理解しています。 – dsharew

答えて

0

グルーヴィーなスクリプトを実行するための推奨方法は、GroovyScriptEngineを使用することです:

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

NB:yoursriptnamepathへのスクリプトの相対パスでなければなりません。

バインディング(引数​​と結果を得る)を渡したい場合は、Bindingを使用する必要があります。

+0

これは、複数のスクリプトを実行している間にクロージャをグローバルに格納するという問題を解決しますか? – pczeus

+0

私はそれに取り組むことができると思いますので、応答には大変感謝しています。 – Jaryn6909

+0

NP。どういたしまして – dsharew

関連する問題