一、前言
对于 Java 中的 JavaScript 引擎, Java 8 引入了 Nashorn
来代替原先的 Rhino
。
Nashorn
使用 Java 7 中引入的调用动态特性,且直接编译内存中的代码并将字节码传递给 JVM。这两项改进,直接给 Nashorn
带了至少 2 到 10 倍的性能提升。
二、JJS使用方式
在 Nashorn
JavaScript 引擎中。JAVA 8 引入了一个新的命令行工具 jjs
,用于在控制台执行 javascript 代码。
创建一个 JavaScript 文件 hello.js
,然后输入以下内容
print("你好,二哥!");
JJS命令执行
gedeMacBook-Pro:test sunjiahao$ jjs hello.js
你好,二哥!
三、JJS交互式解释器
我们也可以直接在命令行中输出 jjs
进入 Java 8 提供的 jjs
交互式解释器。
gedeMacBook-Pro:test sunjiahao$ jjs
jjs>
然后输入一些 JavaScript 语句,就会立即显示结果
gedeMacBook-Pro:test sunjiahao$ jjs
jjs> print('你好,二哥!');
你好,二哥!
jjs> 8+8
16
jjs> 16/4
4
jjs>
四、给 JJS 交互式解释器传递参数
在启动 jjs 交互式解释器时,我们还可以使用两个中划线 ( --
) 来传递一些参数。
参数之间使用空格分隔 ( 注意,多个空格会视为单个空格 )。
例如:
gedeMacBook-Pro:test sunjiahao$ jjs -- Hello Erge! JayLa.
jjs> print('你输入的是:'+arguments.join(","))
你输入的是:Hello,Erge!,JayLa.
jjs>
五、在 Java 中调用 JavaScript
通过 ScriptEngineManager
类,Java 可以解析和调用 JavaScript 代码。
ScriptEngineManager
类在 javax.script
包中。
Java 中调用 javascript 代码范例:
package com.sjh.test.java8.javascript;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class JavaScriptTest {
public static void main(String args[]) {
//1、 创建 JavaScript 引擎的管理器,也就是创建一个 ScriptEngineManager 类的实例。
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
//2、 通过 JavaScript 引擎的管理器获取一个 JavaScript 引擎,比如 Java 8 中引入的 Nashorn。
ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");
String name = "二哥!";
Integer result = null;
try {
nashorn.eval("print('" + name + "')");
//3、 调用获取到的引擎的 eval() 方法执行一些代码。
result = (Integer) nashorn.eval("8 + 2 * 2");
} catch(ScriptException e) {
//执行 JavaScript 代码可能会抛出 ScriptException 异常。因此要放在一个 `try catch` 语句中。
System.out.println("脚本执行失败: "+ e.getMessage());
}
System.out.println(result.toString());
}
}
运行结果:
/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.javascript.JavaScriptTest
二哥!
12
Process finished with exit code 0
六、在 JavaScript 中调用 Java 代码
创建一个 hello.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);
运行结果:
gedeMacBook-Pro:test sunjiahao$ jjs hello.js
78952000000000002017.94
end