Suche…


Einführung

Nashorn ist eine JavaScript-Engine, die in Java von Oracle entwickelt wurde und mit Java 8 veröffentlicht wurde. Nashorn ermöglicht das Einbetten von Javascript in Java-Anwendungen über den JSR-223, die Entwicklung eigenständiger Javascript-Anwendungen, eine bessere Laufzeitleistung und eine bessere Einhaltung der ECMA normalisierte Javascript-Spezifikation.

Syntax

  • ScriptEngineManager // Stellt einen Erkennungs- und Installationsmechanismus für ScriptEngine-Klassen bereit. verwendet eine SPI (Service Provider Interface)
  • ScriptEngineManager.ScriptEngineManager () // Empfohlener Konstruktor
  • ScriptEngine // Stellt die Schnittstelle zur Skriptsprache bereit
  • ScriptEngine ScriptEngineManager.getEngineByName (String shortName) // Factory-Methode für die angegebene Implementierung
  • Object ScriptEngine.eval (String-Skript) // Führt das angegebene Skript aus
  • Object ScriptEngine.eval (Reader) // Lädt ein Skript aus der angegebenen Quelle und führt es aus
  • ScriptContext ScriptEngine.getContext () // Gibt den Standardanbieter für Bindungen, Leser und Schreiber zurück
  • void ScriptContext.setWriter (Writer Writer) // Legt das Ziel fest, an das die Skriptausgabe gesendet werden soll

Bemerkungen

Nashorn ist eine JavaScript-Engine, die in Java geschrieben und in Java 8 enthalten ist. Alles, was Sie brauchen, ist im Paket javax.script enthalten.

Beachten Sie, dass der ScriptEngineManager eine generische API bietet, mit der Sie Skriptmodule für verschiedene Skriptsprachen (dh nicht nur Nashorn, nicht nur JavaScript) erhalten.

Legen Sie globale Variablen fest

// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

// Define a global variable
engine.put("textToPrint", "Data defined in Java.");

// Print the global variable
try {
    engine.eval("print(textToPrint);");
} catch (ScriptException ex) {
    ex.printStackTrace();
}

// Outcome:
// 'Data defined in Java.' printed on standard output

Hallo Nashorn

// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

// Execute an hardcoded script
try {
    engine.eval("print('Hello Nashorn!');");
} catch (ScriptException ex) {
    // This is the generic Exception subclass for the Scripting API
    ex.printStackTrace();
}

// Outcome:
// 'Hello Nashorn!' printed on standard output

Führen Sie die JavaScript-Datei aus

// Required imports
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import java.io.FileReader;
import java.io.FileNotFoundException;

// Obtain an instance of the JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

// Load and execute a script from the file 'demo.js'
try {
    engine.eval(new FileReader("demo.js"));
} catch (FileNotFoundException ex) {
    ex.printStackTrace();
} catch (ScriptException ex) {
    // This is the generic Exception subclass for the Scripting API
    ex.printStackTrace();
}

// Outcome:
// 'Script from file!' printed on standard output

demo.js :

print('Script from file!');

Skriptausgabe abfangen

// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

// Setup a custom writer
StringWriter stringWriter = new StringWriter();
// Modify the engine context so that the custom writer is now the default
// output writer of the engine
engine.getContext().setWriter(stringWriter);

// Execute some script
try {
    engine.eval("print('Redirected text!');");
} catch (ScriptException ex) {
    ex.printStackTrace();
}

// Outcome:
// Nothing printed on standard output, but
// stringWriter.toString() contains 'Redirected text!'

Berechnen Sie arithmetische Zeichenfolgen

// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");

//String to be evaluated
String str = "3+2*4+5";
//Value after doing Arithmetic operation with operator precedence will be 16

//Printing the value
try {
    System.out.println(engine.eval(str));
} catch (ScriptException ex) {
    ex.printStackTrace();
}

//Outcome:
//Value of the string after arithmetic evaluation is printed on standard output.
//In this case '16.0' will be printed on standard output.

Verwendung von Java-Objekten in JavaScript in Nashorn

Es ist möglich, Java-Objekte zur Verarbeitung in Java-Code an die Nashorn-Engine zu übergeben. Gleichzeitig gibt es einige JavaScript- (und Nashorn-) spezifische Konstruktionen, und es ist nicht immer klar, wie sie mit Java-Objekten arbeiten.

Nachfolgend finden Sie eine Tabelle, die das Verhalten nativer Java-Objekte in JavaScript-Konstruktionen beschreibt.

Getestete Konstruktionen:

  1. Ausdruck in if-Klausel. Im JS-Ausdruck in if-Klauseln muss im Gegensatz zu Java kein boolescher Wert sein. Es wird als False für sogenannte Falschwerte (Null, undefiniert, 0, leere Zeichenfolgen usw.) ausgewertet.
  2. Für jede Anweisung hat Nashorn eine spezielle Art von Schleife - für jede -, die verschiedene JS- und Java-Objekte durchlaufen kann.
  3. Objektgröße abrufen In JS-Objekten haben Eigenschaften eine Länge, die die Größe eines Arrays oder einer Zeichenfolge zurückgibt.

Ergebnisse:

Art Ob für jeden .Länge
Java null falsch Keine Iterationen Ausnahme
Java leere Zeichenfolge falsch Keine Iterationen 0
Java-String wahr Durchläuft Zeichenfolgen Länge der Zeichenfolge
Java Integer / Long Wert! = 0 Keine Iterationen nicht definiert
Java ArrayList wahr Iteriert über Elemente Länge der Liste
Java HashMap wahr Iteriert über Werte Null
Java HashSet wahr Iteriert über Elemente nicht definiert

Empfehlungen:

  • Verwenden Sie if (some_string) , um zu überprüfen, ob eine Zeichenfolge nicht null und nicht leer ist
  • for each kann sicher verwendet werden, um über eine Sammlung zu iterieren, und es werden keine Ausnahmen ausgelöst, wenn die Sammlung nicht iterierbar, null oder nicht definiert ist
  • Bevor die Länge eines Objekts abgerufen werden kann, muss es auf null oder undefined geprüft werden (dasselbe gilt für jeden Versuch, eine Methode aufzurufen oder eine Eigenschaft eines Java-Objekts abzurufen)

Implementierung einer Schnittstelle aus einem Skript

import java.io.FileReader;
import java.io.IOException;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class InterfaceImplementationExample {
    public static interface Pet {
        public void eat();
    }

    public static void main(String[] args) throws IOException {
        // Obtain an instance of JavaScript engine
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("nashorn");

        try {
            //evaluate a script
            /* pet.js */
            /*
                var Pet = Java.type("InterfaceImplementationExample.Pet");
                
                new Pet() {
                    eat: function() { print("eat"); }
                }            
            */
            
            Pet pet = (Pet) engine.eval(new FileReader("pet.js"));
            
            pet.eat();
        } catch (ScriptException ex) {
            ex.printStackTrace();
        }

        // Outcome:
        // 'eat' printed on standard output
    }
}

Globale Variablen setzen und abrufen

// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");

try {
    // Set value in the global name space of the engine
    engine.put("name","Nashorn");
    // Execute an hardcoded script
    engine.eval("var value='Hello '+name+'!';");
    // Get value
    String value=(String)engine.get("value");
    System.out.println(value);
} catch (ScriptException ex) {
    // This is the generic Exception subclass for the Scripting API
    ex.printStackTrace();
}

// Outcome:
// 'Hello Nashorn!' printed on standard output


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow