nashorn java_Java 8: Nashorn脚本引擎使用

本文介绍了Java 8中的Nashorn脚本引擎,允许在Java程序中直接运行JavaScript代码。讲解了如何通过ScriptEngineManager获取Nashorn引擎,并通过eval方法执行JavaScript代码。此外,还详细阐述了Java调用JavaScript函数和JavaScript调用Java方法的过程,包括参数传递和类型转换。最后,提到了Nashorn的一些语言扩展,如类型数组、集合、Lambda表达式和Streams等,以及如何在JavaScript中执行Java命令行脚本。
摘要由CSDN通过智能技术生成

使用Nashorn

Nashorn javascript 引擎要么在java程序中以编程的方式使用要么在命令行工具jjs使用,jjs在目录$JAVA_HOME/bin中。如果你准备建立一个jjs的符号链接,如下:

$ cd /usr/bin

$ ln -s $JAVA_HOME/bin/jjs jjs

$ jjs

jjs> print('Hello World');

本教程关注的是在java代码中使用 nashorn ,所以我们现在跳过jjs。用java代码来一个简单的  HelloWorld示例,如下:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");

engine.eval("print('Hello World!');");

为了在java中执行JavaScript代码,首先使用原先Rhino (旧版Java中来自Mozilla的引擎)中的包javax.script来创建一个nashorn脚本引擎。.

既可以向上面那样把JavaScript代码作为一个字符串来直接执行,也可放入一个js脚本文件中,如:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");

engine.eval(new FileReader("script.js"));

Nashorn javascript是基于 ECMAScript 5.1 ,但nashorn后续版本将支持 ECMAScript 6:

当前Nashorn的策略是遵循ECMAScript规范。 当我们发布JDK 8时,我们将实现ECMAScript 5.1标准。后续的 Nashorn的版本将实现 ECMAScript Edition 6标准。

Nashorn定义了很多语言和扩展了 ECMAScript标准的API 。接下来我们看看java与JavaScript的通信。

Java调用Javascript 函数

Nashorn 支持java代码直接调用定义在脚本文件中JavaScript函数。你可以把java对象作为函数的参数且在调用函数的java方法中接收返回的数据。

如下的JavaScript代码将会在java端调用:

48304ba5e6f9fe08f3fa1abda7d326ab.png

var fun1 = function(name) {

print('Hi there from Javascript, ' + name);

return "greetings from javascript";

};

var fun2 = function (object) {

print("JS Class Definition: " + Object.prototype.toString.call(object));

};

48304ba5e6f9fe08f3fa1abda7d326ab.png

为了调用函数,你首先得把脚本引擎转换为 Invocable。NashornScriptEngine 实现了 Invocable 接口且定义一个调用JavaScript函数的方法 invokeFunction ,传入函数名即可。

48304ba5e6f9fe08f3fa1abda7d326ab.png

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");

engine.eval(new FileReader("script.js"));

Invocable invocable = (Invocable) engine;

Object result = invocable.invokeFunction("fun1", "Peter Parker");

System.out.println(result);

System.out.println(result.getClass());

// Hi there from Javascript, Peter Parker

// greetings from javascript

// class java.lang.String

48304ba5e6f9fe08f3fa1abda7d326ab.png

上述代码的执行将在控制台打印三行信息。调用 print 函数将输出内容通过管道送到 System.out 控制台,因此我们首先看到的是 JavaScript打印的信息。

现在我们通过传递任意的 Java 对象去调用第二个函数:

48304ba5e6f9fe08f3fa1abda7d326ab.png

invocable.invokeFunction("fun2", new Date());

// [object java.util.Date]

invocable.invokeFunction("fun2", LocalDateTime.now());

// [object java.time.LocalDateTime]

invocable.invokeFunction("fun2", new Person());

// [object com.winterbe.java8.Person]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值