转载

Java新特性之JavaScript引擎

什么是JavaScript引擎

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

什么是jjs

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

为什么要JavaScript引擎

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

如何使用JavaScript引擎

jjs命令行实例

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

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());
	}
	
}

输出结果

huangdayu.cn
12

JavaScript调用Java

实例

test2.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);

输出结果

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 新特性终极指南
原文  https://www.huangdayu.cn/2019/04/17/Java新特性之JavaScript引擎/
正文到此结束
Loading...