Nashorn 引擎介绍
Nashorn 是 Java 中一个非常强大且性能优越的 JavaScript 引擎。它在 Java 8 中被引入以取代现有的 JavaScript 引擎 Rhino。相较于其前身,Nashorn 引擎在性能上提升了 2 至 10 倍。它可以将 JavaScript 代码直接编译成内存中的字节码。Nashorn 利用了 Java 7 中引入的动态特性来提升性能。
使用 Nashorn 引擎,我们可以在命令行工具中执行 JavaScript 代码。我们可以在 Java 文件中嵌入 JavaScript 代码,并在 Java 代码库中调用 JavaScript 方法。同时也可以使用 jjs 调用 Java 方法。
通过命令行工具执行 JavaScript
对于 Nashorn 引擎,Java 8 引入了一个新的命令行工具 jjs,用于在控制台执行 JavaScript 代码。jjs 是一个多用途工具,它可以解释 JavaScript 文件以及 JavaScript 代码片段。我们甚至可以使用 jjs 在 JavaScript 代码中调用 Java 方法。
示例
解释 js 文件
首先尝试在 C:> JAVA 文件夹中创建并保存文件 sample.js。这个 sample.js 文件包含一个单一的 JavaScript 语句,使用 print()
方法在控制台上打印 "Hello World"。
sample.js
print('Hello World!');
打开控制台并使用以下命令。这里 jjs
将读取 sample.js 文件,解释 JavaScript 代码片段并执行代码。
C:\JAVA>jjs sample.js
这将产生以下输出:
Hello World!
让我们更新 sample.js 使其包含一个可以被调用的 JavaScript 函数。
sample.js
function sayMessage(){
print('Hello World!');
}
sayMessage();
打开控制台并使用以下命令。
C:\JAVA>jjs sample.js
这将产生以下输出:
Hello World!
我们也可以直接在命令提示符下使用 jjs
执行 JavaScript 代码片段。
直接在命令提示符中执行 JavaScript
打开控制台并输入 jjs
,然后按 Enter 键。jjs
工具将打开一个交互式会话。一旦 jjs
会话打开,我们可以执行 JavaScript 代码。完成操作后,键入 quit()
并按 Enter 键退出 jjs
交互式会话并返回到命令提示符。
示例
C:\JAVA>jjs
jjs> print("Hello, World!")
Hello, World!
jjs> quit()
>>
C:\JAVA>
向 jjs 传递参数
jjs
使用一个特殊的结构 arguments
来存储传递的命令行参数。请看下面的示例:
打开控制台并使用以下命令。
示例
C:\JAVA> jjs -- a b c
jjs> print('letters: ' +arguments)
letters: a,b,c
jjs> quit()
>>
C:\JAVA>
从 Java 调用 JavaScript
自从 Java 6 开始,Java 就有了 ScriptEngineManager
类,可以用来加载 JavaScript 引擎作为 ScriptEngine
实例。一旦引擎被加载到 Java 代码中,我们可以调用 eval()
方法来在 Java 中评估 JavaScript 代码。我们甚至可以在 JavaScript 代码片段中使用 Java 变量。
示例
使用任意编辑器在 C:> JAVA 创建以下 Java 程序。
Java8Tester.java
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
public class Java8Tester {
public static void main(String args[]) {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");
String name = "Mahesh";
Integer result = null;
try {
nashorn.eval("print('" + name + "')");
result = (Integer) nashorn.eval("10 + 2");
} catch(ScriptException e) {
System.out.println("执行脚本出错: "+ e.getMessage());
}
System.out.println(result.toString());
}
}
验证结果
使用 javac
编译器编译类:
C:\JAVA>javac Java8Tester.java
现在运行 Java8Tester
:
C:\JAVA>java Java8Tester
这应该产生以下结果:
Mahesh
12
从 JavaScript 调用 Java
使用 jjs
工具,我们甚至可以在 JavaScript 代码片段中调用 Java 代码。在下面的示例中,我们使用 Java.type('java.math.BigDecimal')
创建了一个 BigDecimal
类型。一旦 BigDecimal
类被加载,我们就可以在 JavaScript 代码中使用它的方法,如下所示:
示例
在 C:> JAVA 文件夹中创建并保存 sample.js。
sample.js
var BigDecimal = Java.type('java.math.BigDecimal');
function calculate(amount, percentage) {
var result = new BigDecimal(amount).multiply(new BigDecimal(percentage)).divide(
new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_EVEN);
return result.toPlainString();
}
var result = calculate(568000000000000000023,13.9);
print(result);
打开控制台并使用以下命令:
C:\JAVA>jjs sample.js
这应该产生以下输出:
78952000000000000003.20