Nashorn简介

引入了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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NashornJava 8中引入的一个JavaScript引擎。它允许在Java应用程序中执行JavaScript代码,并提供了与Java互操作的能力。 为了使用Nashorn,我们需要创建一个ScriptEngine实例。可以通过以下方式来实现: ``` import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class NashornExample { public static void main(String[] args) { // 创建ScriptEngine实例 ScriptEngineManager engineManager = new ScriptEngineManager(); ScriptEngine engine = engineManager.getEngineByName("nashorn"); try { // 执行JavaScript代码 engine.eval("print('Hello, Nashorn!')"); } catch (ScriptException e) { e.printStackTrace(); } } } ``` 在上述示例中,我们首先通过ScriptEngineManager获取ScriptEngine实例,并指定使用Nashorn引擎。然后,我们可以使用eval方法执行JavaScript代码。在这个例子中,我们执行了一行代码来打印"Hello, Nashorn!"。 Nashorn还提供了一些与Java对象互操作的能力。我们可以在JavaScript代码中访问Java类、调用Java方法和获取/设置Java对象的属性。以下是一个简单的示例: ``` import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class NashornExample { public static void main(String[] args) { ScriptEngineManager engineManager = new ScriptEngineManager(); ScriptEngine engine = engineManager.getEngineByName("nashorn"); try { // 在JavaScript代码中使用Java类 engine.eval("var LocalDate = Java.type('java.time.LocalDate')"); engine.eval("var now = LocalDate.now()"); engine.eval("print('Today is ' + now)"); } catch (ScriptException e) { e.printStackTrace(); } } } ``` 在这个示例中,我们在JavaScript代码中使用了Java的`java.time.LocalDate`类来获取当天的日期,并打印出来。 Nashorn的使用非常灵活,可以与现有的Java代码很好地集成。它能够为Java开发人员提供更多的选择和可能性,并且在一些特定的场景中可能比传统的Java更方便和便捷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值