引入了Java 8和名为“ Nashorn”的新JavaScript引擎。 Nashorn基于Da Vinci Machine,该项目旨在为JVM添加动态语言支持。 Nashorn是使混合软件比以前更轻松的一个很好的里程碑。 该引擎的出色功能使您能够在Java(任何其他编译语言)代码和javascript之间进行全双工通信。
使用Nashorn的最简单方法是JDK 8或OpenJDK 8中捆绑的命令行工具,您可以在“ / bin”中找到它。 通过执行jjs,您将面对jjs提示符,提示您可以交互使用Nashorn,也可以将js文件作为参数传递给jjs。 您可以在下面找到使用jjs的基本示例:
考虑下面的simple.js文件:
var name="Nashorn";
print(name);
现在,通过调用:jjs simple.js,将在屏幕上显示“ Nashorn”文本。
我认为jjs足以用于介绍,如果您需要更多信息,可以键入jjs -help。
您也可以在Java代码中使用Nashorn脚本引擎。 考虑下面的Program.java文件:
public class Program {
public static void main(String... args) throws ScriptException {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine nashornEngine = factory.getEngineByName("nashorn");
nashornEngine.eval("print('hello world');");
}
}
使用此简单的代码,您的屏幕上将会显示一个非常漂亮的问候世界。 您也可以将js文件评估为脚本引擎,ScriptEngine接口的eval方法具有Reader抽象类类型的重载。 因此,您可以简单地传递任何作为Reader类实例的对象。 考虑以下代码:
script1.js内容:
var version = 1;
function hello(name) {
return "hello " + name;
}
Program.java内容:
public class Program {
public static void main(String... args) throws ScriptException, NoSuchMethodException {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine nashornEngine = factory.getEngineByName("nashorn");
nashornEngine.eval(new InputStreamReader(Program.class.getResourceAsStream("script1.js")));
System.out.println(nashornEngine.get("version"));
Invocable invocable = (Invocable) nashornEngine;
Object result = invocable.invokeFunction("hello", "soroosh");
System.out.println(result);
}
}
ScriptEngine接口有一个get方法,如您在示例中所注意到的,您可以调用它来检索ScriptEngine中定义的任何变量或任何状态。 在上面的示例中,“ version”是在simple.js文件中声明的变量。
每个脚本引擎都有其自己的ScriptEngine类实现,并且脚本引擎可以实现一些可选接口以扩展其功能。 如果您检查NashornSriptEngine的源代码,则类签名为:
public final class NashornScriptEngine extends javax.script.AbstractScriptEngine implements javax.script.Compilable, javax.script.Invocable
因此,Nashorn脚本引擎也使您能够使用这两个界面。 在上面的示例中,用于调用在脚本引擎中声明的函数的示例使用了Invocable接口。
注意: ScriptEngine是有状态的,因此,如果您在脚本引擎上调用某些函数或评估某些代码,则对象和变量的状态可能会影响其结果。
结论:
在这篇文章中,我试图以一种非常基本和实用的方式介绍Nashorn。在以后的文章中,我将进一步展示Java + Nashorn的互操作性及其在现实世界中的用法。
翻译自: https://www.javacodegeeks.com/2014/04/introduction-to-nashorn.html