Java新特性之JavaScript引擎

什么是JavaScript引擎

  早在Java 6时就引入了JavaScript引擎Rhino,它支持ECMAScript 5.1规范,它使用JSR 292言特性。Java 7时引入了invokedynamic,将JavaScript编译成Java字节码。Java 8引入的新的JavaScript引擎NashornRhino性能提高多倍,Nashorn就是javax.script.ScriptEngine的另一种实现。

什么是jjs

  jjs是个基于Nashorn引擎的命令行工具。它可以接受JavaScript源代码为参数,并且执行这些源代码。

为什么要JavaScript引擎

  为了使JavaJavaScript两门语言在JVM环境下能相互调用。

如何使用JavaScript引擎

jjs命令行实例

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
29
C:\Users\Administrator\Desktop\back\new 
λ touch test.js                         
                                        
C:\Users\Administrator\Desktop\back\new 
λ vim test.js                           
                                        
C:\Users\Administrator\Desktop\back\new 
λ cat test.js                           
print("This is JavaScript test code."); 

C:\Users\Administrator\Desktop\back\new 
λ jjs test.js                           
This is JavaScript test code.           

# 交互式编程

C:\Users\Administrator\Desktop\back\new
λ jjs
jjs> print("this is JavaScript test code")
this is JavaScript test code
jjs>

# 传递参数

C:\Users\Administrator\Desktop\back\new
λ jjs -- a b c
jjs> print("传递的参数:"+arguments.join(","))
传递的参数:a,b,c
jjs>

Java调用JavaScript

实例

Test.java

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;

public class Test13 {
	public static void main(String[] args) {
		java_JavaScript();
	}
	
	private static void java_JavaScript() {
		ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
		ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");

		String name = "huangdayu.cn";
		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());
	}
	
}

输出结果

1
2
huangdayu.cn
12

JavaScript调用Java

实例

test2.js

1
2
3
4
5
6
7
8
9
10
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);

输出结果

1
2
3
4
5
6
F:\Android\Java\Eclipse Project SSM\NewCharacteristic\js
λ touch test2.js

F:\Android\Java\Eclipse Project SSM\NewCharacteristic\js
λ jjs test2.js
78952000000000002017.94

参考文献

Java 8 官方文档
Java 8 新特性
Java 8 新特性终极指南

今日诗词

作者信息