如何确定浏览器中的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并故意这样做)。 –