本文概述
Nashorn是JavaScript引擎。它用于在JVM(Java虚拟机)上动态执行JavaScript代码。 Java提供了用于执行JavaScript代码的命令行工具jjs。
你可以通过使用jjs命令行工具并嵌入到Java源代码中来执行JavaScript代码。
示例:使用终端执行
以下是在JVM中执行JavaScript代码的分步过程。
1)创建一个文件hello.js。
2)编写以下代码并将其保存到文件中。
var hello = function(){
print("Hello Nashorn");
};
hello();
3)打开终端
4)编写命令jjs hello.js, 然后按Enter。
执行命令后, 你将看到以下输出。
输出:
Hello Nashorn
示例:在Java代码中执行JavaScript文件
你可以直接从Java文件执行JavaScript文件。在以下代码中, 我们将在FileReader类的帮助下读取文件hello.js。
import javax.script.*;
import java.io.*;
public class NashornExample {
public static void main(String[] args) throws Exception{
// Creating script engine
ScriptEngine ee = new ScriptEngineManager().getEngineByName("Nashorn");
// Reading Nashorn file
ee.eval(new FileReader("js/hello.js"));
}
}
输出:
Hello Nashorn
示例:在Java源文件中嵌入JavaScript代码
你可以将JavaScript代码嵌入Java源文件中。 Java编译器不会抱怨, 但是当你拥有大量源代码时, 这不是一个好习惯。在以下示例中, 我们正在评估JavaScript代码。
import javax.script.*;
public class NashornExample {
public static void main(String[] args) throws Exception{
// Creating script engine
ScriptEngine ee = new ScriptEngineManager().getEngineByName("Nashorn");
// Evaluating Nashorn code
ee.eval("print('Hello Nashorn');");
}
}
输出:
Hello Nashorn
示例:嵌入JavaScript表达式
你可以在JavaScript代码中嵌入JavaScript表达式和变量。在以下代码中, 我们将变量嵌入到字符串中。要执行此程序, 你需要在命令行中传递标记-scripting。
档案:hello.js
var hello = function(msg){
print("Hello ${msg}");
};
hello("Nashron");
命令:jjs-脚本hello.js
输出:
Hello Nashorn
Heredocs
在Nashorn中, heredocs只是多行字符串。你可以在<<后面加上特殊的终止标记EOF来创建它。你也可以在$ {…}表达式中嵌入JavaScript表达式。
示例:JavaScript文件中的heredocs
文件:hello.js
var message = <<EOF
This is a java script file
it contains multiple lines
of code.
let's execute.
EOF
print(message)
命令:jjs-脚本hello.js
输出:
This is a java script file
it contains multiple lines
of code.
let's execute.
示例:在Java文件中设置JavaScript变量
你可以将值传递给Java文件中的JavaScript变量。在下面的示例中, 我们将变量绑定并传递到JavaScript文件。
档案:hello.js
print("Hello "+name);
文件:NashornExample.java
import javax.script.*;
import java.io.*;
public class NashornExample {
public static void main(String[] args) throws Exception{
// Creating script engine
ScriptEngine ee = new ScriptEngineManager().getEngineByName("Nashorn");
//Binding script and Define scope of script
Bindings bind = ee.getBindings(ScriptContext.ENGINE_SCOPE);
bind.put("name", "Nashorn");
// Reading Nashorn file
ee.eval(new FileReader("js/hello.js"));
}
}
输出:
Hello Nashorn
在JavaScript文件中导入Java包
Java提供了一种在JavaScript代码内部导入Java包的功能。在这里, 我们使用两种方法来导入Java包。
示例1:在JavaScript文件中导入Java包
档案:hello.js
print(java.lang.Math.sqrt(4));
输出:
2
示例2:在JavaScript文件中导入Java包
档案:hello.js
var importFile = new JavaImporter(java.util);
var a = new importFile.ArrayList();
a.add(12);
a.add(20);
print(a);
print(a.getClass());
输出:
[12, 20]
class java.util.ArrayList
示例3:在JavaScript文件中导入Java包
你可以同时导入多个软件包。
档案:hello.js
var importIt = new JavaImporter(java.lang.String, java.util, java.io);
with (importIt) {
var linkedHS = new LinkedHashSet();
linkedHS.add(new File("abc"));
linkedHS.add(new File("hello.js"));
linkedHS.add("india".toUpperCase());
}
print(linkedHS);
输出:
[abc, hello.js, INDIA]
在Java代码中调用JavaScript函数
你可以在Java文件中调用JavaScript函数。在下面的示例中, 我们正在调用JavaScript函数。
示例:在Java代码中调用函数
档案:hello.js
var functionDemo1 = function(){
print("This is JavaScript function");
}
var functionDemo2 = function(message){
print("Hello "+message);
}
文件:NashornExample.java
import javax.script.*;
import java.io.*;
public class NashornExample {
public static void main(String[] args) throws Exception{
// Creating script engine
ScriptEngine ee = new ScriptEngineManager().getEngineByName("Nashorn");
// Reading Nashorn file
ee.eval(new FileReader("js/hello.js"));
Invocable invocable = (Invocable)ee;
// calling a function
invocable.invokeFunction("functionDemo1");
// calling a function and passing variable as well.
invocable.invokeFunction("functionDemo2", "Nashorn");
}
}
输出:
This is JavaScript function
Hello Nashorn
评论前必须登录!
注册