Java 简明教程

Java - Nashorn JavaScript Engine

Nashorn JavaScript Engine

Nashorn 是 Java 中一个非常强大且高效的 Javascript Engine。引入 Java 8 以替换现有的 javascript 引擎 Rhino。Nashorn 引擎的性能比其早期版本快 2 到 10 倍。它可以直接将 javascript 代码编译为内存中的字节码。它利用 Java 7 中引入的动态特性来提升性能。

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

Execute JavaScript via Command Line Tools

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

Example

Interpreting js File

我们首先尝试在 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 代码片段。

Execute JavaScript Directly in Command Prompt

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

Example

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

Passing Arguments to jjs

jjs 使用特殊构造 arguments 来存储通过的 command line arguments 。见以下示例:

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

Example

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

Calling JavaScript from Java

自 Java 6 起,Java 有一个 ScriptEngineManager 类,可以用来将 javascript 引擎加载为 ScriptEngine 实例。在 Java 代码中加载引擎之后,我们可以调用 eval() 方法以在 Java 中评估 JavaScript 代码。我们甚至可以在 javascript 代码片段中使用 Java variable(s)

Example

在任意编辑器中创建以下 Java 程序,例如,在 C:\> 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());
   }
}

Verify the Result

按照如下方式使用 javac 编译器编译类 −

C:\JAVA>javac Java8Tester.java

现在按照如下方式运行 Java8Tester −

C:\JAVA>java Java8Tester

它应该产生以下结果 −

Mahesh
12

Calling Java from JavaScript

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

Example

在 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