2016-06-09 18 views
5

Ci sono diverse domande su come determinare il motore javascript nel browser. Devo scrivere il codice javascript che deve essere eseguito su rhino e nashorn.Come posso determinare quale motore javascript, rhino o nashorn sta eseguendo il mio codice?

Come è possibile determinare se il mio codice è in esecuzione su rhino o nashorn? Ci sono funzioni tipografiche, variabili, costanti in cui è possibile determinare il motore?

+3

Interessante. Perché hai bisogno del controllo? –

+0

Se stai chiedendo di rhino vs nashorn, non stai solo chiedendo di JDK SE 8 vs> 8? –

+0

@JohnGreen: * "... su JDK SE 8 vs> 8?" * Nashorn è stato aggiunto in JDK8 (non> 8). Ed è [ancora possibile eseguire Rhino in JDK8] (https://wiki.openjdk.java.net/display/Nashorn/Using+Rhino+JSR-223+engine+with+JDK8) (ma devi aggiungere un barattolo e farlo apposta). –

risposta

1

Guardando allo Rhino to Nashorn migration guide, vedo diversi modi possibili.

Se non si utilizza lo script di compatibilità Rhino, questo lo farebbe:

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

... dal importClass è definito per Rhino ma non per Nashorn (a meno che non si include lo script di compatibilità).

Io penso Java.type è Nashorn-specifici, in modo da:

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

Si potrebbe verificare per il confezionamento delle eccezioni:

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; 
} 

... dal momento che la guida alla migrazione dice che sarà true per Nashorn ma false per Rhino. Implica il lancio di un'eccezione, che è sfortunata.

+0

# 2 è il mio preferito. Il controllo su _Java_ sta testando davvero una funzione di Nashorn. Non mi aspetto che questo verrà aggiunto a Rhino. – Christian13467

1

Con l'opzione --no-java, "Java" non è definito come oggetto in Nashorn. Il migliore sarebbe di controllare qualcosa che è sempre disponibile in Nashorn. Qualcosa come DIR o FILE variabile è un buon candidato. Sempre lì a Nashorn.

jjs> typeof DIR

stringa

Se si utilizza API javax.script (e non JJs), è possibile ottenere il nome del motore e controllare così:

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()); 
    } 
} 

Con Nashorn, vedresti "Oracle Nashorn" come nome del motore.

+0

Utilizziamo il motore incorporato in un'applicazione java. È una funzionalità per avere pieno accesso alle classi dall'applicazione in giro. – Christian13467

+0

Ok. In tal caso, ti consiglio di controllare che il nome del motore sia "Oracle Nashorn". Il nome dovrebbe essere stabile per Nashorn. –