Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络编程

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java API 和框架

Java 类参考

Java 有用资源

Java - Nashorn JavaScript 引擎



Nashorn JavaScript 引擎

Nashorn 是 Java 中一个非常强大且性能优异的 JavaScript 引擎。它在 Java 8 中引入,用于替换现有的 JavaScript 引擎 Rhino。Nashorn 引擎的性能比其之前的对应版本快 2 到 10 倍。它可以将 JavaScript 代码直接编译成内存中的字节码。它利用 Java 7 中引入的动态特性来提高性能。

使用 Nashorn 引擎,我们可以在命令行工具中执行 JavaScript 代码。我们可以在 Java 文件中嵌入 JavaScript 代码,并在 Java 代码库中调用 JavaScript 方法。我们还可以使用 jjs 在 JavaScript 中调用 Java 方法

通过命令行工具执行 JavaScript

对于 Nashorn 引擎,JAVA 8 引入了一个新的命令行工具 jjs,用于在控制台中执行 JavaScript 代码。jjs 是一个多功能的工具,它可以解释 JavaScript 文件以及 JavaScript 代码片段。我们甚至可以使用 jjs 在 JavaScript 代码中调用 Java 方法。

示例

解释 js 文件

首先尝试在 c:\> JAVA 文件夹中创建并保存文件 sample.js。此 sample.js 文件包含一条 JavaScript 语句,使用 print() 方法在控制台上打印“Hello World”。

sample.js

print('Hello World!');

打开控制台并使用以下命令。此处 jjs 将读取 sample.js 文件,解释 JavaScript 代码片段并执行代码。

C:\JAVA>jjs sample.js

它将产生以下输出

Hello World!

让我们更新 sample.js 以包含一个要调用的 JavaScript 函数。

sample.js

function sayMessage(){
   print('Hello World!');	
}
sayMessage();

打开控制台并使用以下命令。

C:\JAVA>jjs sample.js

它将产生以下输出

Hello World!

我们也可以直接使用 jjs 评估或执行 JavaScript 代码片段。

在命令提示符下直接执行 JavaScript

打开控制台并键入 jjs,然后按 Enter 键。jjs 工具将打开一个交互式会话。打开 jjs 会话后,我们可以执行 JavaScript 代码。完成后,键入 quit() 并按 Enter 键退出 jjs 交互式会话并返回到命令提示符。

示例

C:\JAVA>jjs
jjs> print("Hello, World!")
Hello, World!
jjs> quit()
>>
C:\JAVA>

将参数传递给 jjs

jjs 使用一个特殊的构造 arguments 来存储传递的 命令行参数。请参见下面的示例

打开控制台并使用以下命令。

示例

C:\JAVA> jjs -- a b c
jjs> print('letters: ' +arguments)
letters: a,b,c
jjs> quit()
>>
C:\JAVA>

从 Java 调用 JavaScript

从 Java 6 开始,Java 就有 ScriptEngineManager 类,可用于将 JavaScript 引擎加载为 ScriptEngine 实例。在 Java 代码中加载引擎后,我们可以调用 eval() 方法在 Java 中评估 JavaScript 代码。我们甚至可以在 JavaScript 代码片段中使用 Java 变量

示例

使用您选择的任何编辑器(例如,在 C:\> JAVA 中)创建以下 Java 程序。

Java8Tester.java

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

public class Java8Tester {

   public static void main(String args[]) {
      // create the script engine manager   
      ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
      // load the Nashorn javascript engine
      ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");
		
      String name = "Mahesh";
      Integer result = null;
      
      try {
         // call the javascript function, pass a java variable	  
         nashorn.eval("print('" + name + "')");
         // call the javascript function and get the result back in java
         result = (Integer) nashorn.eval("10 + 2");
         
      } catch(ScriptException e) {
         System.out.println("Error executing script: "+ e.getMessage());
      }
      System.out.println(result.toString());
   }
}

验证结果

使用javac编译器编译该类,如下所示:

C:\JAVA>javac Java8Tester.java

现在运行 Java8Tester,如下所示:

C:\JAVA>java Java8Tester

它应该产生以下结果:

Mahesh
12

从 JavaScript 调用 Java

使用 jjs 工具,我们甚至可以在 JavaScript 代码片段中调用 Java 代码。在下面的示例中,我们首先使用 Java.type(' java.math.BigDecimal ') 创建了一个 BigDecimal 类型。加载 BigDecimal 类后,我们可以在 JavaScript 代码中使用其方法,如下所示

示例

在 c:\> JAVA 文件夹中创建并保存sample.js

sample.js

// import BigDecimal java class
var BigDecimal = Java.type('java.math.BigDecimal');

function calculate(amount, percentage) {
   // use the BigDecimal class instances to showcase BigDecimal calculations
   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);

打开控制台并使用以下命令。

C:\JAVA>jjs sample.js

它应该产生以下输出:

78952000000000000003.20
广告