2017-04-03 1 views
1

Ist es möglich, Closures aus verschiedenen groovigen Skripten zu speichern? Lassen Sie uns sagen, dass ich eine Art von Klasse, die die Verschlüsse speichern soll:Groovy globale Speicherung von Closures aus verschiedenen Skripten

package com.test 

class ClosureContainer { 
    static closures = [:] 

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

Und dann würde Ich mag groovy Skripte haben, die Verschlüsse ihm hinzufügen würde:

import com.test.ClosureContainer as container 

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

Und später, ich sollte in der Lage sein, es wie zu nennen:

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

Was ist der beste Ansatz, es in Groovy zu tun? Ich bin mir nicht sicher, wie ich mit dem Aufruf der Skripte umgehen soll, da Klassen aus diesen Skripten generiert werden. Ich bin in der Lage, Instanzen der Skripts zur Laufzeit zu erstellen, aber ich kann keine Liste der Klassen/Skripte abrufen, ohne sie hart zu codieren.

UPDATE:

Nehmen wir an, ich testScript.groovy in Paket com.test.scripts haben, die ein paar Verschlüsse in den Behälter hinzufügt. Ich habe versucht, die gradle erzeugen Klassen aus den Skripten zu lassen und beispielsweise in dem Code wie folgt erstellen:

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

Und ich bin hartzucodieren den Testscript Namen. Aber es wird viele Skripte geben und ich sollte es dynamisch abrufen können.

+0

was meinst du mit hart codieren? Welcher Teil Ihres Codes ist fest codiert? – dsharew

+0

Ich habe die Frage aktualisiert. – Jaryn6909

+0

Oh ich verstehe jetzt in diesem Fall müssen Sie GroovyScriptEngine verwenden. – dsharew

Antwort

0

Der empfohlene Weg groovy Skript auszuführen ist GroovyScriptEngine zu verwenden:

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

NB: yoursriptname sollte der Pfad des Skripts in Bezug auf path.

Wenn Sie Bindings (Argumente und dann die Ergebnisse) übergeben möchten, müssen Sie Binding verwenden.

+0

Wird dadurch die Frage gelöst, ob die Schließungen global über mehrere Skripts hinweg gespeichert werden sollen? – pczeus

+0

Ich denke, ich kann damit arbeiten, also vielen Dank für die Antwort. – Jaryn6909

+0

NP. Bitte – dsharew

Verwandte Themen