哈哈,好了不开玩笑了,今天的主角就是java8的新特性Nashorn JavaScript(完全支持ECMAScript 5.1规范以及一些扩展),简单来说,就是可用通过它实现,java和javascript代码的互相调用。当然,其实这个特性java8以前就有(Rhino),只不过java8这个新的对以前进行了优化。
至于怎么用呢?让我们看下面这个例子。
我们都知道,javascript里面有个函数eval(String),可以对传入的合法字符串参数进行计算。下面让我们通过java调用javascript的eval函数进行计算表达式:
package Test;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Cal {
public static Object calculate(String s){
Object object = null;
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");
try {
object = nashorn.eval(s);
} catch (ScriptException e) {
object = "请输入正确表达式!!! please input the correct formula!!!";
}
return object;
}
public static void main(String[] args) {
System.out.println(calculate("(347+34.5)/(75-72)+34**3").toString());
}
}
当然这种写法,在自己本地还可以运行,如果你想用这个方法过oj?额,反正我是没成功过。。。
当然除此之外,你还可以jjs命令行工具,用js代码进行交互(先要安装好并配置好java8环境)。
jjs
jjs是个基于Nashorn引擎的命令行工具。它接受一些JavaScript源代码为参数,并且执行这些源代码。
例如,我们创建一个具有如下内容的sample.js文件:
print('Hello World!');
打开控制台,输入以下命令:
$ jjs sample.js
以上程序输出结果为:
Hello World!
jjs 交互式编程
打开控制台,输入以下命令:
$
jjs //进入控制台输入jjs指令
jjs> print("Hello, World!")
Hello, World!
jjs> quit()
传递参数
打开控制台,输入以下命令:
$ jjs -- a b c
jjs> print('字母: ' +arguments.join(", "))
字母: a, b, c
jjs>
JavaScript 中调用 Java
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);
我们使用 jjs 命令执行以上脚本,输出结果如下:
$ jjs sample.js
78952000000000002017.94
但java11中此特性好像又会被移除。。。
欢迎关注公众号BatFor