前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 8 新特性|Nashorn JavaScript

Java 8 新特性|Nashorn JavaScript

作者头像
Java小技巧
发布2022-05-23 12:53:03
9010
发布2022-05-23 12:53:03
举报
文章被收录于专栏:Java小技巧

一、前言

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

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

二、JJS使用方式

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

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

代码语言:javascript
复制
print("你好,二哥!");

JJS命令执行

代码语言:javascript
复制
gedeMacBook-Pro:test sunjiahao$ jjs hello.js
你好,二哥!

三、JJS交互式解释器

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

代码语言:javascript
复制
gedeMacBook-Pro:test sunjiahao$ jjs
jjs>

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

代码语言:javascript
复制
gedeMacBook-Pro:test sunjiahao$ jjs
jjs> print('你好,二哥!');
你好,二哥!
jjs> 8+8
16
jjs> 16/4
4
jjs>

四、给 JJS 交互式解释器传递参数

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

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

例如:

代码语言:javascript
复制
gedeMacBook-Pro:test sunjiahao$ jjs -- Hello Erge! JayLa.
jjs> print('你输入的是:'+arguments.join(","))
你输入的是:Hello,Erge!,JayLa.
jjs>

五、在 Java 中调用 JavaScript

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

ScriptEngineManager 类在 javax.script 包中。

Java 中调用 javascript 代码范例:

代码语言:javascript
复制
package com.sjh.test.java8.javascript;

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

public class JavaScriptTest {

    public static void main(String args[]) {
        //1、 创建 JavaScript 引擎的管理器,也就是创建一个 ScriptEngineManager 类的实例。
        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        //2、 通过 JavaScript 引擎的管理器获取一个 JavaScript 引擎,比如 Java 8 中引入的 Nashorn。
        ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");

        String name = "二哥!";
        Integer result = null;

        try {
            nashorn.eval("print('" + name + "')");
            //3、 调用获取到的引擎的 eval() 方法执行一些代码。
            result = (Integer) nashorn.eval("8 + 2 * 2");

        } catch(ScriptException e) {
            //执行 JavaScript 代码可能会抛出 ScriptException 异常。因此要放在一个 `try catch` 语句中。
            System.out.println("脚本执行失败: "+ e.getMessage());
        }
        System.out.println(result.toString());
    }
}

运行结果:

代码语言:javascript
复制
/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/...com.sjh.test.java8.javascript.JavaScriptTest
二哥!
12

Process finished with exit code 0

六、在 JavaScript 中调用 Java 代码

创建一个 hello.js 文件,然后...

代码语言:javascript
复制
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);

运行结果:

代码语言:javascript
复制
gedeMacBook-Pro:test sunjiahao$ jjs hello.js
78952000000000002017.94

end

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java小技巧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档