1. 首页
  2. java8教程

014-十四、Java 8 Nashorn JavaScript

引言

对于 Java 中的 JavaScript 引擎, Java 8 引入了 Nashorn 来代替原先的 Rhino

Nashorn 使用 Java 7 中引入的调用动态特性,且直接编译内存中的代码并将字节码传递给 JVM。这两项改进,直接给 Nashorn 带了至少 210 倍的性能提升。

jjs

Nashorn JavaScript 引擎中。JAVA 8 引入了一个新的命令行工具 jjs,用于在控制台执行 javascript 代码。

例如我们可以在当前目录下 ( 任意位置 ) 创建一个 JavaScript 文件 hello.js ,然后输入以下内容


print('你好,研发军团,教程 !');

保存文件后,使用下面的 jjs 命令运行它
jjs hello.js

运行结果如下


[penglei@www.ycbbs.vip helloworld]$ jjs hello.js 你好,研发军团,教程 !

jjs 交互式解释器

我们也可以直接在命令行中输出 jjs 进入 Java 8 提供的 jjs 交互式解释器。


[penglei@www.ycbbs.vip helloworld]$ jjs jjs>

然后输入一些 JavaScript 语句,就会立即显示结果


jjs> print('你好,研发军团,教程 !'); 你好,搜云库技术团队,教程 ! jjs> 5 + 8 jjs> 8 / 5 .6 jjs>

jjs 交互式解释器传递参数
在启动 jjs 交互式解释器时,我们还可以使用两个中划线 ( — ) 来传递一些参数。

参数之间使用空格分隔 ( 注意,多个空额会视为单个空格 )。

例如


[penglei@www.ycbbs.vip helloworld]$ jjs -- 你好 研发军团 教程 jjs> print('你输入的是: ' +arguments.join(", ")) 你输入的是: 你好, 研发军团, 教程 jjs>

在 Java 中调用 JavaScript

通过 ScriptEngineManager 类,Java 可以解析和调用 JavaScript 代码。

ScriptEngineManager 类在 javax.script 包中。

Java 中调用 javascript 代码的步骤一般如下

1、 创建 JavaScript 引擎的管理器,也就是创建一个 ScriptEngineManager 类的实例。


ScriptEngineManager scriptEngineManager = new ScriptEngineManager();

2、 通过 JavaScript 引擎的管理器获取一个 JavaScript 引擎,比如 Java 8 中引入的 Nashorn


ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");

3、 调用获取到的引擎的 eval() 方法执行一些代码。


result = (Integer) nashorn.eval("10 + 2");

需要注意的是,执行 JavaScript 代码可能会抛出 ScriptException 异常。因此要放在一个 try catch 语句中。
上面这三个流程,会涉及到三个类 ScriptEngineManager、ScriptEngine 和 ScriptException。它们都在 javax.script 包中。


import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; import javax.script.ScriptException;

我们写一个范例演示下这个流程

Java8Tester.java


import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; import javax.script.ScriptException; public class Java8Tester { public static void main(String args[]) { ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn"); String name = "研发军团"; Integer result = null; try { nashorn.eval("print('" + name + "')"); result = (Integer) nashorn.eval("8 + 5 * 3"); } catch(ScriptException e) { System.out.println("脚本执行失败: "+ e.getMessage()); } System.out.println(result.toString()); } } //运行结果如下 [penglei@www.ycbbs.vip helloworld]$ javac Java8Tester.java && java Java8Tester 研发军团

在 JavaScript 中调用 Java 代码

如果在 JavaScript 中调用 Java 代码,我们就不做过多介绍了,因为介绍起来是一个庞大的工程,简直就是另外一门语言的赶脚。

直接看一个示例。

把创建一个 hello.js 文件,然后输入以下内容

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); 然后我们使用 jjs 命令来运行它 [penglei@www.ycbbs.vip helloworld]$ jjs hello.js .94

写完了如果写得有什么问题,希望读者能够给小编留言,也可以点击[此处扫下面二维码关注微信公众号](https://www.ycbbs.vip/?p=28 "此处扫下面二维码关注微信公众号")

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:014-十四、Java 8 Nashorn JavaScript

    链接:https://www.javajike.com/article/1407.html

« 015-十五、Java 8 新日期时间 API ( 上 ) – 本地日期时间
013-十三、Java 8 可选值 java.util.Optional 类»

相关推荐

QR code