2016-06-09 58 views
5

如何確定瀏覽器中的JavaScript引擎有幾個問題。 我必須編寫必須在犀牛和納霍恩上運行的JavaScript代碼。如何確定哪個JavaScript引擎,rhino或nashorn正在運行我的代碼?

如何確定我的代碼是在犀牛還是納霍恩上運行?是否有典型的函數,變量,常量可以確定引擎?

+3

有趣。你爲什麼需要這張支票? –

+0

如果你問關於rhino vs nashorn,你不是在問關於JDK SE 8 vs> 8嗎? –

+0

@JohnGreen:*「...關於JDK SE 8 vs 8」* *在JDK8中添加了Nashorn(不是> 8)。 [它仍然可以在JDK8中運行Rhino](https://wiki.openjdk.java.net/display/Nashorn/Using+Rhino+JSR-223+engine+with+JDK8)(但是你必須添加一個jar並故意這樣做)。 –

回答

1

看看Rhino to Nashorn migration guide,我看到幾種可能的方式。

如果你不使用Rhino的兼容性腳本,這將做到這一點:

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

...因爲importClass是犀牛,但不是犀牛定義的(除非你包括兼容性腳本)。

認爲Java.type是犀牛特定的,因此:

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

你可以檢查異常的包裝:

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

...因爲遷移指南說,這將是true爲Nashorn,但爲犀牛false。它涉及拋出一個不幸的例外。

+0

#2是我的最愛。檢查_Java_是真正測試Nashorn功能的。我不期望,這將被添加到犀牛。 – Christian13467

1

使用--no-java選項時,「Java」未在Nashorn中定義爲對象。最好的辦法是檢查一下Nashorn總是有的東西。像DIRFILE變量是一個很好的候選人。永遠在那裏。

JJS>的typeof DIR

如果您正在使用的javax.script API(而不是JJS),你可以得到的引擎名稱和檢查,以及:

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

與Nashorn,你會看到「Oracle Nashorn」作爲引擎名稱。

+0

我們使用嵌入在Java應用程序中的引擎。這是一個功能,可以全面訪問應用程序中的類。 – Christian13467

+0

好的。在這種情況下,我建議檢查引擎名稱是「Oracle Nashorn」。預計這個名字對於Nashorn來說是穩定的。 –

相關問題