2022-08-07  阅读(3)
原文作者:简单教程 原文地址:https://www.twle.cn/

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

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

jjs

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

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

                print('你好,简单教程,简单编程!');

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

                jjs hello.js

运行结果如下

                [yufei@www.twle.cn helloworld]$ jjs hello.js
                你好,简单教程,简单编程!

jjs 交互式解释器

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

                [yufei@www.twle.cn helloworld]$ jjs
                jjs>

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

                jjs> print('你好,简单教程,简单编程!');
                你好,简单教程,简单编程!
                jjs> 5 + 8
                13
                jjs> 8 / 5
                1.6
                jjs>

给 jjs 交互式解释器传递参数

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

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

例如

                [yufei@www.twle.cn 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");
  1. 调用获取到的引擎的 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());
           }
        }
    运行结果如下
        [yufei@www.twle.cn helloworld]$ javac Java8Tester.java && java Java8Tester
        简单教程
        23
    ## 在 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` 命令来运行它
        [yufei@www.twle.cn helloworld]$ jjs hello.js 
        78952000000000002017.94
    --------------------
    
    来源:[https://www.twle.cn][https_www.twle.cn]
    
    
    [https_www.twle.cn]: https://www.twle.cn

Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文