新特性07| Nashorn JavaScript

简介

With Java 8, Nashorn, a much improved javascript engine is introduced, to replace the existing Rhino. Nashorn provides 2 to 10 times better performance, as it directly compiles the code in memory and passes the bytecode to JVM. Nashorn uses invoke dynamics feature, introduced in Java 7 to improve performance.

(译文)Java8中引入了一个改进的javascript引擎,Nashorn,它替换掉了之前的Rhino引擎。因为Nashorn引擎直接在内存中编译代码并将字节码传递给JVM,所以其性能比之前的提高了2~10倍。Nashorn使用Java7中引入的动态调用特性来提高性能。

说明

  1. Rihino和Nashorn都是在JVM上基于JavaScript语言实现的。
  2. Nashron引擎既可以用在Java代码中,也可以借助位于$JAVA_HOME/bin下的jjs工具在命令行中使用。

jjs

  1. jjs简介:基于Nashorn引擎的命令行工具。它接受一些JavaScript源代码为参数,并且执行这些源代码。
  2. 使用方法
  • jjs demo.js(得保证demo.js里由对象的javascript代码)
  • 交互式编程,直接输入jjs命令即可进入,举例如下
    1
    2
    3
    $ jjs
    jjs> print('Hello jjs!');
    Hello jjs!

传递参数

代码示例

1
2
3
4
$ jjs -- a b c
jjs> print('letter: ' + arguments.join(" + "));
letter: a + b + c
jjs>

Java中调用JavaScript

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.util.Optional;

public class Java8Tester {
public static void main(String[] args) {
// 初始化脚本引擎管理器
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
// 获取nashron引擎
ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");

String name = "Runoob";
Integer result = null;

try {
// 执行指定的脚本
nashorn.eval("print('" + name + "')");
result = (Integer) nashorn.eval("10 + 2");

} catch (ScriptException e) {
System.out.println("执行脚本错误: " + e.getMessage());
}

Optional<Integer> str = Optional.ofNullable(result);
str.ifPresent(System.out::println);
}
}

输出:

1
2
Runoob
12

JavaScript中调用Java

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 利用Java类型定义大数类型小数
var BigDecimal = Java.type('java.math.BigDecimal');

// calculate方法
function calculate(amount, percentage) {
// 先将大数型整数转为大数型小数,乘以percentage,再除以100
// 结果取两位小数,并且按照银行家取舍法进行取舍
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);

输出

1
78952000000000002017.94

更多详细内容参见官方文档

码哥 wechat
欢迎关注个人订阅号:「码上行动GO」