Frage

Ich versuche, Groovy zu schaffen eine interaktive Skript - / makro-Modus für meine Anwendung.Die Anwendung ist OSGi und viele der Informationen, die Skripts müssen nicht im Vorfeld wissen.Ich dachte, ich könnte verwenden GroovyShell und aufrufen von eval() mehrere Male kontinuierlich Anhängen, um den namespace als OSGi-bundles geladen werden.GroovyShell unterhält variable Zustand über mehrere eval fordert, aber nicht Klassendefinitionen oder Methoden.

Ziel:Erstellen Sie eine Basisklasse, die während des Startvorgangs.Als OSGi-bundles zu laden, erstellen von abgeleiteten Klassen, wie gebraucht.

War es hilfreich?

Lösung 2

Endete injizieren von code vor jedem Skript Zusammenstellung.Ziel ist, dass der Benutzer Schrift hat eine domain-spezifische Sprache zur Verfügung.

Andere Tipps

Ich bin nicht sicher, was Sie meinen, über den angegebenen Klassen nicht zwischen die vorhandenen evals, die folgenden zwei Skripte arbeiten wie erwartet, wenn evaled einer nach dem anderen:

class C {{println 'hi'}}
new C()

...

new C()

Jedoch Methoden, gebunden werden, um die Klasse, erklärten Sie, und GroovyShell schafft eine neue Klasse für jede Instanz.Wenn Sie brauchen nicht die return-Wert einer der Skripts und Sie sind wirklich scripts (nicht Klassen mit main-Methoden), die Sie Anhängen können, die folgenden am Ende jeder ausgewertet Scripte.

Class klass = this.getClass()
this.getMetaClass().getMethods().each {
  if (it.declaringClass.cachedClass == klass) {
    binding[it.name] = this.&"$it.name"
  }
}

Wenn Sie sind abhängig von der Rückgabewert kann man die hand-verwalten Sie die Bewertung und führen Sie das Skript als Teil Ihrer Analyse (Warnung, ungetestete code folgt, zur Veranschaulichung verwendet nur)...

String scriptText = ...
Script script = shell.parse(scriptText)
def returnValue = script.run()
Class klass = script.getClass()
script.getMetaClass().getMethods().each {
  if (it.declaringClass.cachedClass == klass) {
    shell.context[it.name] = this.&"$it.name"
  }
}
// do whatever with returnValue...

Es gibt einen letzten VORBEHALT, ich bin sicher, Sie sind sich dessen bewusst.Statisch typisierte Variablen werden nicht gehalten zwischen evals, da Sie nicht gespeichert werden in die Bindung.So im vorherigen Skript die variable 'klass" wird nicht werden gehalten zwischen Skript Aufrufe und dann verschwinden.Zu berichtigen entfernen Sie einfach die Typ-Deklarationen bei der ersten Verwendung aller Variablen, das heißt, Sie werden gelesen und geschrieben werden, um die Bindung.

Dies könnte das sein, was Sie suchen?

Von Groovy in Aktion

def binding = new Binding(x: 6, y: 4)
def shell = new GroovyShell(binding)
def expression = '''f = x * y'''
shell.evaluate(expression)
assert binding.getVariable("f") == 24

Eine entsprechende Verwendung der Bindung wird erlauben Sie zu pflegen Staat?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top