IDEA2023.1.3破解,IDEA破解,IDEA 2023.1破解,最新IDEA激活码

十四、Java 8 Nashorn JavaScript

IDEA2023.1.3破解,IDEA破解,IDEA 2023.1破解,最新IDEA激活码

文章永久连接:https://tech.souyunku.com/?p=5012

对于 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

运行结果如下

[penglei@tech.souyunku.com helloworld]$ jjs hello.js
你好,搜云库技术团队,教程 !

jjs 交互式解释器

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

[penglei@tech.souyunku.com helloworld]$ jjs
jjs> 

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

jjs> print('你好,搜云库技术团队,教程 !');
你好,搜云库技术团队,教程 !
jjs> 5 + 8
13
jjs> 8 / 5
1.6
jjs> 

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

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

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

例如

[penglei@tech.souyunku.com 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` 语句中。

上面这三个流程,会涉及到三个类 ScriptEngineManagerScriptEngineScriptException。它们都在 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@tech.souyunku.com 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 命令来运行它

[penglei@tech.souyunku.com helloworld]$ jjs hello.js 
78952000000000002017.94

干货推荐

本站推荐:精选优质专栏

附录:Java8 新特性:系列文章

赞(71) 打赏



未经允许不得转载:搜云库技术团队 » 十四、Java 8 Nashorn JavaScript

IDEA2023.1.3破解,IDEA破解,IDEA 2023.1破解,最新IDEA激活码
IDEA2023.1.3破解,IDEA破解,IDEA 2023.1破解,最新IDEA激活码

评论 抢沙发

大前端WP主题 更专业 更方便

联系我们联系我们

觉得文章有用就打赏一下文章作者

微信扫一扫打赏

微信扫一扫打赏


Fatal error: Uncaught Exception: Cache directory not writable. Comet Cache needs this directory please: `/data/wangzhan/tech.souyunku.com.wp/wp-content/cache/comet-cache/cache/https/tech-souyunku-com/index.q`. Set permissions to `755` or higher; `777` might be needed in some cases. in /data/wangzhan/tech.souyunku.com.wp/wp-content/plugins/comet-cache/src/includes/traits/Ac/ObUtils.php:367 Stack trace: #0 [internal function]: WebSharks\CometCache\Classes\AdvancedCache->outputBufferCallbackHandler() #1 /data/wangzhan/tech.souyunku.com.wp/wp-includes/functions.php(5109): ob_end_flush() #2 /data/wangzhan/tech.souyunku.com.wp/wp-includes/class-wp-hook.php(303): wp_ob_end_flush_all() #3 /data/wangzhan/tech.souyunku.com.wp/wp-includes/class-wp-hook.php(327): WP_Hook->apply_filters() #4 /data/wangzhan/tech.souyunku.com.wp/wp-includes/plugin.php(470): WP_Hook->do_action() #5 /data/wangzhan/tech.souyunku.com.wp/wp-includes/load.php(1097): do_action() #6 [internal function]: shutdown_action_hook() #7 {main} thrown in /data/wangzhan/tech.souyunku.com.wp/wp-content/plugins/comet-cache/src/includes/traits/Ac/ObUtils.php on line 367