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引入了一个新的命令行工具,即 jjs 。我们需要按照以下步骤通过控制台执行JavaScript代码:
- 创建一个名为geeks.js的文件。
- 打开geeks.js并将以下代码写入文件并保存。
var gfg= function(){
print("欢迎来到Geeksforgeeks!!!");
};
gfg();
- 打开命令提示符,输入 jjs geeks.js 并按Enter。它将生成以下输出:
欢迎来到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');");
}
}
输出:
欢迎来到Geeksforgeeks!使用Nashorn引擎执行JavaScript代码
除了上述方法,还可以通过Nashorn JavaScript引擎执行多种操作 :
- 从Java代码向JavaScript提供变量 : 假设我们有一个名为geeks.js的JavaScript文件,geeks.js在执行过程中需要一个变量。通过Nashorn的帮助,我们可以从Java代码中传递变量给JavaScript文件。
示例1: geeks.js文件,需要 name 变量才能执行
// JavaScript文件名为geeks.js
print("Welcome to Geeksforgeeks!!! Mr. "+name);
示例2: Java代码向JS文件提供 name 变量
// 用于展示从Java代码向JavaScript文件传递变量的程序
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文件名为geeks.js
var func1 = function(){
print("Simple JavaScript function!!!");
}
var func2 = function(reader){
print("Hello "+reader);
}
// 用于展示从Java代码调用JavaScript函数的程序
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;
// 这里我们调用func1
invocable.invokeFunction("func1");
// 这里我们调用func2
// 同时传递参数
invocable.invokeFunction("func2",
"Bishal Kumar Dubey");
}
}
输出:
Simple JavaScript function!!!
Hello Bishal Kumar Dubey