Java 简明教程
Java - Nashorn JavaScript Engine
Nashorn JavaScript Engine
Nashorn 是 Java 中一个非常强大且高效的 Javascript Engine。引入 Java 8 以替换现有的 javascript 引擎 Rhino。Nashorn 引擎的性能比其早期版本快 2 到 10 倍。它可以直接将 javascript 代码编译为内存中的字节码。它利用 Java 7 中引入的动态特性来提升性能。
Nashorn is a very powerful and performant Javascript Engine in Java. It was introduced in Java 8 to replace the existing javascript engine, Rhino. Nashorn engine is 2 to 10 times faster in performance than it earlier counterpart. It can directly compile the javascript code to the bytcode in memory. It utilizes the dyanamics features introduced in Java 7 to boost performance.
使用 Nashorn engine ,我们可以在命令行工具中执行 JavaScript 代码。我们可以将 JavaScript 代码嵌入到 Java 文件中,并在 Java 代码库中调用 JavaScript 方法。我们还可以在 JavaScript 中使用 jjs. 调用 java methods
Using Nashorn engine, we can execute JavaScript code in command line tools. We can embed a javascript code in Java file and call the javascript methods in java code base. We can call java methods in javascript as well using jjs.
Execute JavaScript via Command Line Tools
对于 Nashorn 引擎,JAVA 8 引入了一个新的命令行工具 jjs,,用于在控制台中执行 javascript 代码。jjs 是一个多功能工具,它可以解释 javascript 文件和 javascript 代码片段。我们甚至可以使用 jjs 在 javascript 代码中调用 java 方法。
For Nashorn engine, JAVA 8 introduces a new command line tool, jjs, to execute javascript codes at console. jjs is a versatile tool, it can interpret a javascript file as well as javascript code snippet. We can use jjs to even call java methods in a javascript code.
Example
Interpreting js File
我们首先尝试在 c:\> JAVA 文件夹中创建并保存文件 sample.js。此 sample.js 文件包含一条 javascript 语句,使用 print() 方法在控制台中打印“Hello World”。
Let’s first try to create and save the file sample.js in c:\> JAVA folder. This sample.js file is having a single javascript statement to print "Hello World" on the console using print() method.
sample.js
print('Hello World!');
打开控制台并使用以下命令。此处,jjs 将读取 sample.js 文件,解释 javascript 代码片段并执行代码。
Open console and use the following command. Here jjs will read the sample.js file, interpret the javascript code snippet and execute the code.
C:\JAVA>jjs sample.js
它将生成以下输出:
It will produce the following output:
Hello World!
让我们更新 sample.js 以拥有一个要调用的 javascript 函数。
Let’s update the sample.js to have a javascript function to be called.
sample.js
function sayMessage(){
print('Hello World!');
}
sayMessage();
打开控制台并使用以下命令。
Open console and use the following command.
C:\JAVA>jjs sample.js
它将生成以下输出:
It will produce the following output:
Hello World!
我们也可以使用 jjs 直接评估或执行 javascript 代码片段。
We can evaluate or execute a javascript code snippet using jjs directly as well.
Execute JavaScript Directly in Command Prompt
打开控制台,输入 jjs 并按 Enter 键。jjs 工具将打开一个交互式会话。在 jjs 会话打开后,我们就可以执行 javascript 代码。完成后,输入 quit() 并按 Enter 键退出 jjs 交互式会话,返回命令提示符。
Open the console and type jjs and press enter button. jjs tool will open an interactive session. Once jjs session is open, we can execute a javascript code. Once done, type quit() and press enter button to exit the jjs interactive session and to return back to the command prompt.
Passing Arguments to jjs
jjs 使用特殊构造 arguments 来存储通过的 command line arguments 。见以下示例:
jjs uses a special construct arguments to store the command line arguments passed. See the example below:
打开控制台,并使用以下命令。
Open the console and use the following command.
Calling JavaScript from Java
自 Java 6 起,Java 有一个 ScriptEngineManager 类,可以用来将 javascript 引擎加载为 ScriptEngine 实例。在 Java 代码中加载引擎之后,我们可以调用 eval() 方法以在 Java 中评估 JavaScript 代码。我们甚至可以在 javascript 代码片段中使用 Java variable(s) 。
Java has a ScriptEngineManager class since Java 6, which can be used to load the javascript engine as ScriptEngine instance. Once engine is loaded in the java code, we can call eval() method to evaluate a JavaScript code in Java. We can even use Java variable(s) in javascript code snippet.
Example
在任意编辑器中创建以下 Java 程序,例如,在 C:\> JAVA 中创建。
Create the following Java program using any editor of your choice in, say, 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());
}
}
Calling Java from JavaScript
使用 jjs 工具,我们甚至可以在 Javascript 代码片段中调用 Java 代码。在以下示例中,我们首先使用 Java.type (' java.math.BigDecimal ') 创建了一个 BigDecimal 类型。一旦加载了 BigDecimal 类,我们就可以在 JavaScript 代码中使用其方法,如下所示:
Using jjs tool, we can even call Java code in a Javascript code snippet. In following example, we’ve created a BigDecimal type first by using Java.type ('java.math.BigDecimal'). Once BigDecimal class is loaded, we can use its method within JavaScript code as shown below:
Example
在 c:\> JAVA 文件夹中创建并保存 sample.js。
Create and save sample.js in c:\> JAVA folder.
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);
打开控制台,并使用以下命令。
Open the console and use the following command.
C:\JAVA>jjs sample.js
它应该产生以下输出 −
It should produce the following output −
78952000000000000003.20