2016-06-09 18 views
5

Es gibt einige Fragen, wie man die Javascript Engine im Browser ermittelt. Ich muss Javascript-Code schreiben, der auf Rhino und Nashorn laufen muss.Wie kann ich feststellen, welche Javascript Engine, Rhino oder Nashorn meinen Code ausführt?

Wie kann ich feststellen, ob mein Code auf Rhino oder Nashorn läuft? Gibt es typische Funktionen, Variablen, Konstanten, in denen man die Engine bestimmen kann?

+3

Interessant. Warum brauchst du den Scheck? –

+0

Wenn Sie nach Rhino vs Nashorn fragen, fragen Sie nicht nur über JDK SE 8 vs> 8? –

+0

@JohnGreen: * "... über JDK SE 8 vs> 8?" * Nashorn wurde in JDK8 hinzugefügt (nicht> 8). Und es ist [immer noch möglich, Rhino in JDK8 auszuführen] (https://wiki.openjdk.java.net/display/Nashorn/Using+Rhino+JSR-223+engine+mit+JDK8) (aber Sie müssen ein Glas hinzufügen und mache es absichtlich). –

Antwort

1

Mit Blick auf die Rhino to Nashorn migration guide sehe ich mehrere Möglichkeiten.

Wenn Sie nicht mit dem Rhino-Kompatibilitätsskript verwenden, dies würde es tun:

var usingNashorn = typeof importClass !== "function"; 

... seit importClass für Rhino definiert ist, aber nicht für Nashorn (sofern Sie die Kompatibilitätsskript enthalten).

I denkenJava.type ist Nashorn-spezifisch, so:

var usingNashorn = typeof Java !== "undefined" && Java && typeof Java.type === "function"; 

Sie für die Verpackung von Ausnahmen überprüfen könnten:

var usingNashorn; 
try { 
    // Anything that will throw an NPE from the Java layer 
    java.lang.System.loadLibrary(null); 
} catch (e) { 
    // false! 
    usingNashorn = e instanceof java.lang.NullPointerException; 
} 

... da die Migration Guide sagt, dass true sein für Nashorn aber false für Rhino. Es beinhaltet eine Ausnahme, die unglücklich ist.

+0

# 2 ist mein Favorit. Die Überprüfung auf _Java_ testet wirklich eine Nashorn-Funktion. Ich erwarte nicht, dass dies zu Rhino hinzugefügt wird. – Christian13467

1

Mit --no-java Option ist "Java" nicht als Objekt in Nashorn definiert. Am besten wäre es, etwas zu überprüfen, das immer in Nashorn verfügbar ist. Etwas wie DIR oder Datei Variable ist ein guter Kandidat. Immer da in Nashorn.

jjs> typeof DIR

String

Wenn Sie javax.script API (und nicht jjs) verwenden, können Sie den Motor Namen als gut und überprüfen:

import javax.script.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
    ScriptEngineManager m = new ScriptEngineManager(); 
    ScriptEngine e = m.getEngineByName("nashorn"); 
    System.out.println(e.getFactory().getEngineName()); 
    } 
} 

Mit Nashorn würden Sie "Oracle Nashorn" als den Motornamen sehen.

+0

Wir verwenden die Engine in einer Java-Anwendung eingebettet. Es ist eine Funktion, um vollen Zugriff auf Klassen aus der Anwendung zu haben. – Christian13467

+0

Okay. In diesem Fall würde ich empfehlen, den Namen der Engine als "Oracle Nashorn" zu prüfen. Dieser Name wird voraussichtlich für Nashorn stabil sein. –