带有示例的Java中的 Nashorn JavaScript 引擎
Nashorn :Nashorn 是 JDK 8 中引入的 JavaScript 引擎。借助 Nashorn,我们可以在Java虚拟机上执行 JavaScript 代码。 Nashorn 在 JDK 8 中被引入以取代现有的 JavaScript 引擎,即 Rhino。 Nashorn在性能方面远胜于Rhino。调用动态特性、将 JavaScript 代码转换为字节码直接存入内存等的使用使得 Nashorn 在 JDK 8 中更加出名。我们可以通过使用命令行工具并将 JavaScript 代码嵌入到Java源代码中来执行 JavaScript 代码.
使用控制台执行 JavaScript 代码:对于 Nashorn 引擎, Java 8 引入了一种新的命令行工具,即jjl 。我们必须按照以下步骤通过控制台执行 JavaScript 代码:
- 创建一个名为 geeks.js 的文件。
- 打开 geeks.js 并将以下代码写入文件并保存。
var gfg= function(){ print("Welcome to Geeksforgeeks!!!"); }; gfg();
- 打开 CMD,写jjl geeks.js然后回车。它将生成以下输出:
Welcome to Geeksforgeeks!!!
通过将 JavaScript 文件嵌入到Java代码中来执行 JavaScript 文件:我们可以通过ScriptEngine类将 JavaScript 文件嵌入到Java代码中来执行 JavaScript 文件。 ScriptEngine 类是在 JDK 6 中引入的。借助 ScriptEngine 类,我们可以创建一个 JavaScript 引擎,通过 JavaScript 引擎,我们可以执行 javaScript 文件。
示例 1:
// Program to illustrate embedding
// of JavaScript file into Java code
import javax.script.*;
import java.io.*;
public class Geeksforgeeks {
public static void main(String[] args)
throws Exception
{
// Here we are generating Nashorn JavaScript Engine
ScriptEngine ee = new ScriptEngineManager()
.getEngineByName("Nashorn");
// Reading JavaScript file create in first approach
ee.eval(new FileReader("geeks.js"));
}
}
输出:
Welcome to Geeksforgeeks!!!
示例 2:
// Program to illustrate embedding
// of JavaScript code into Java code
import javax.script.*;
import java.io.*;
public class Geeksforgeeks {
public static void main(String[] args)
throws Exception
{
// Here we are generating Nashorn JavaScript Engine
ScriptEngine ee = new ScriptEngineManager()
.getEngineByName("Nashorn");
// Instead of reading JavaScript code from a file.
// We can directly paste the JavaScript
// code inside Java Code
ee.eval("print('Welcome to Geeksforgeeks!!!"
+ " Executing JavaScript code with the"
+ " help of Nashorn engine');");
}
}
输出:
Welcome to Geeksforgeeks!!! Executing JavaScript code with the help of Nashorn engine
除此之外,在 Nashorn JavaScript Engine 的帮助下,我们可以执行多个操作,例如:
- 从Java代码提供 JavaScript 变量:假设我们有一个带有 geeks.js 的 JavaScript 文件名,而 geeks.js 在执行期间需要一个变量。在 Nashorn 的帮助下,我们可以将变量从Java代码传递到 JavaScript 文件。
示例 1: geeks.js 文件,需要name变量才能执行
// JavaScript file name with geeks.js print("Welcome to Geeksforgeeks!!! Mr. "+name);
示例 2:为 JS 文件提供名称变量的Java代码
// Program to illustrate passing of variable // from java code to javascript file import javax.script.*; import java.io.*; public class Geeksforgeeks { public static void main(String[] args) throws Exception { ScriptEngine ee = new ScriptEngineManager() .getEngineByName("Nashorn"); Bindings bind = ee.getBindings( ScriptContext.ENGINE_SCOPE); bind.put("name", "Bishal Kumar Dubey"); ee.eval(new FileReader("geeks.js")); } }
输出:
Welcome to Geeksforgeeks!!! Mr. Bishal Kumar Dubey
- 从Java代码调用 JavaScript函数:我们可以借助 Nashorn 从Java代码调用 JavaScript函数。假设我们用 geeks.js 创建一个文件名,该文件包含两个函数,如下所示:
// JavaScript file name with geeks.js var func1 = function(){ print("Simple JavaScript function!!!"); } var func2 = function(reader){ print("Hello "+reader); }
// Program to illustrate calling of // JavaScript function from Java code import javax.script.*; import java.io.*; public class Geeksforgeeks { public static void main(String[] args) throws Exception { ScriptEngine ee = new ScriptEngineManager() .getEngineByName("Nashorn"); ee.eval(new FileReader("geeks.js")); Invocable invocable = (Invocable)ee; // Here we are calling func1 invocable.invokeFunction("func1"); // Here we are calling func2 // as well as passing argument invocable.invokeFunction("func2", "Bishal Kumar Dubey"); } }
输出:
Simple JavaScript function!!! Hello Bishal Kumar Dubey