Ich rufe eine @JSFunction
annotierte Methode eines ScriptableObject
Die JavaScript-Datei
%Vor%Die Java-Datei
%Vor%Aber ich bekomme
%Vor% und ich weiß nicht, wo ich hingehen soll. Wenn ich nicht addModifier
method aufruft, funktioniert der angegebene Code, und angesichts des Fehlers notFunctionError
down im Stack-Trace denke ich, dass Rhino die angegebene Methode nicht als JavaScript-Funktion interpretiert.
Komplettes Maven-Projekt, das den Fehler reproduziert, finden Sie hier
tl; dr siehe diese zwei Alternativen.
Das Problem mit dem obigen Ansatz ist, dass Target.prototype
im Skriptbereich nicht richtig eingerichtet ist. Weitere Informationen finden Sie in der statischen Methode ScriptableObject.defineClass()
Details zur korrekten Definition von Prototypen in einem Skriptumfang.
Sie haben mehrere Möglichkeiten, Ihren Skripten den Konstruktor Target
bereitzustellen. Die erste Alternative würde immer den Target
-Konstruktor für alle Skripte definieren. Dies funktioniert gut, wenn Sie im Voraus wissen, dass Target
global verfügbar sein soll. Das kommt im Wesentlichen auf Folgendes an:
Wenn der Skriptautor stattdessen entscheiden soll, welche Konstruktoren erforderlich sind, wird die zweite Alternative verwendet Stellen Sie die defineClass
-Funktion für Skripts bereit. Mit dieser Funktion können Skriptautoren beliebige skriptfähige Objekte auf ihrem Klassenpfad "importieren" (was möglicherweise mehr ist, als Sie zulassen möchten). Um die Funktionen defineClass
für Skripts bereitzustellen, führen Sie nach dem Eingeben des Kontexts Folgendes aus:
Und dann verwendet der JavaScript-Autor den Target
-Konstruktor wie folgt:
In beiden obigen Zweigen habe ich noch ein paar andere Änderungen vorgenommen, die Sie besser einrichten, wenn Sie dem Konstruktor Target
mehr hinzufügen. Der Nullargumentkonstruktor benötigt nicht die Annotation @JSConstructor
. Wenn Sie später einen Konstruktor haben möchten, der Argumente akzeptiert, wird dieser Nullargumentkonstruktor als Prototypkonstruktor verwendet, und Sie können die Annotation @JSConstructor
für eine Methode verwenden, die zum Initialisieren Ihres Objekts verwendet wird. Je nachdem, wie Sie diese Konstruktormethode erstellen, wird es wichtig, das Schlüsselwort new
in Ihrem JavaScript zu verwenden.
Kurz gesagt, die Packages.com.acme...
-Syntax ist nicht nützlich, um Zugriff auf ScriptableObject
-Konstruktoren von Skripten zu erhalten.
Tags und Links javascript java rhino