Rhino: Wie übergeben Sie Java-Objekt ein Skript, wo kann referenziert werden, als "dieses"
Ich bin neu auf JSR-223 Java-Scripting, eigentlich bin ich ja die Umschaltung von MVEL standard Mozilla Rhino-JS. Ich habe gelesen, alle Unterlagen, aber nicht weiterkommen. Ich habe versucht, einige Java-Referenz-Objekte aus dem script von Bindungen ebenso wie im tutorial:
//my object
public class MyBean {
public String getStringValue() { return "abc" };
}
//initialization
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
//add bindings
engine.put("bean", new MyBean());
//evaluate script, output is "abc"
engine.eval("print(bean.stringValue)");
Java-Objekt verwiesen wird, wird vom Drehbuch als Eigenschaft bean
. So weit So gut.
Aber ich will meine Referenz-Objekt im Skript als this
möchte ich seine Eigenschaften und Methoden ohne Präfix oder explizit mit dem Präfix this
. Genau wie dieser:
//add bindings
engine.put(....., new MyBean()); //or whatever ???
//evaluate scripts, all have the same output "abc"
engine.eval("print(stringValue)");
engine.eval("print(this.stringValue)");
Ich weiß, dass this
in JavaScript spezielle Bedeutung (wie in Java), aber in der MVEL-scripting, was getan werden könnte, indem Sie benutzerdefinierte ParserContext
und benutzerdefinierte PropertyHandler
.
Ist so etwas möglich in Rhino?
Vielen Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nun, in JavaScript ist es wirklich nur sinnvoll zu denken, über
this
wird in den Kontext einer Funktion aufgerufen wird. Also ich denke, Sie sollten in der Lage sein, um die "invoke" - Methode auf die ScriptEngine (das muss Stimmen, um "Invocable"):Nun die "objectForThis" Referenz ist (in meiner Erfahrung) in der Regel etwas, das war nach der Rückkehr von einem vorherigen Aufruf von "eval()" (oder "invokeMethod" I guess); in anderen Worten, es soll ein Objekt sein, das in der entsprechenden Sprache für die script-engine. Ob Sie passieren durften, in ein Java-Objekt da ist (und funktioniert out), weiß ich nicht sicher.
"function run() { %s }"
und rufen Sie dannrun
von invokeMethod (), wie Sie vorgeschlagen undthis
für mich funktioniert. Ein Nachteil ist, dass Benutzer-Skript zu verwenden hatreturn
keyword-streng-mit eval() Skript Ergebnis-auch ohnereturn
Stichwort-aber nie Verstand, es ist viel besser als eine andere Lösung.this
Präfix. I. e.print("this.stringValue")
funktioniert, aberprint("stringValue")
nicht.this
an ein Objekt gebunden. Wenn "stringValue" ist der name einer Eigenschaft auf diethis
Objekt, dann ist das, wie JavaScript funktioniert immer, Rhino oder nicht.Ich versuche, umzusetzen diese Idee Antwort von Spitzen (danke nochmal), aber diese Umgehungsmöglichkeit funktioniert nicht für Eigenschaften, ohne
this
Präfix zu sein scheint, IMHO die gleichen. Anstelle der Verwendung von Rhino 1.5 von Java-API, es ist ein original Rhino 1.7 von Mozilla. Testfall ist hier:Warum
this.getStringValue()/this.stringValue
funktioniert undgetStringValue()/stringValue
nicht? Haben einige Punkt übersehen? Spitzen?this
wird davon ausgegangen, als Bezugsgröße. JavaScript unterscheidet sich von Java in dieser Hinsicht (wie auch in vielen anderen). Wenn Sie möchten, eine Eigenschaftthis
Sie muss Referenz es explizit (oder Referenz eine Kopie des Werts, oder so ähnlich).