如何確定瀏覽器中的JavaScript引擎有幾個問題。 我必須編寫必須在犀牛和納霍恩上運行的JavaScript代碼。如何確定哪個JavaScript引擎,rhino或nashorn正在運行我的代碼?
如何確定我的代碼是在犀牛還是納霍恩上運行?是否有典型的函數,變量,常量可以確定引擎?
如何確定瀏覽器中的JavaScript引擎有幾個問題。 我必須編寫必須在犀牛和納霍恩上運行的JavaScript代碼。如何確定哪個JavaScript引擎,rhino或nashorn正在運行我的代碼?
如何確定我的代碼是在犀牛還是納霍恩上運行?是否有典型的函數,變量,常量可以確定引擎?
看看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
。它涉及拋出一個不幸的例外。
#2是我的最愛。檢查_Java_是真正測試Nashorn功能的。我不期望,這將被添加到犀牛。 – Christian13467
使用--no-java選項時,「Java」未在Nashorn中定義爲對象。最好的辦法是檢查一下Nashorn總是有的東西。像DIR或FILE變量是一個很好的候選人。永遠在那裏。
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」作爲引擎名稱。
我們使用嵌入在Java應用程序中的引擎。這是一個功能,可以全面訪問應用程序中的類。 – Christian13467
好的。在這種情況下,我建議檢查引擎名稱是「Oracle Nashorn」。預計這個名字對於Nashorn來說是穩定的。 –
有趣。你爲什麼需要這張支票? –
如果你問關於rhino vs nashorn,你不是在問關於JDK SE 8 vs> 8嗎? –
@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並故意這樣做)。 –