2016-06-09 54 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来说是稳定的。 –

相关问题