Java中提供了一个脚本引擎管理器:ScriptEngineManager,它会在虚拟机启动时发现可用的脚本引擎。
脚本引擎管理器
构造一个 ScriptEngineManager,调用它的 getEngineFactories 方法,可用获取到当前Java环境所有支持的引擎工厂,可用通过循环去获取每个引擎工厂的属性。请参考以下代码:
public static void main(String[] args) {
// 构造一个脚本引擎管理器
ScriptEngineManager manager = new ScriptEngineManager();
// 遍历所有的引擎工厂,输出引擎工厂的信息
for (ScriptEngineFactory factory : manager.getEngineFactories()) {
String engineName = factory.getEngineName();
String engineVersion = factory.getEngineVersion();
String languageName = factory.getLanguageName();
String languageVersion = factory.getLanguageVersion();
ScriptEngine engine = factory.getScriptEngine();
System.out.println(String.format("引擎名称:%s\t引擎版本:%s\t语言名称:%s\t语言版本:%s\t",
engineName, engineVersion, languageName, languageVersion));
}
}
以上程序可能会输出以下结果:
引擎名称:Oracle Nashorn 引擎版本:1.8.0_152 语言名称:ECMAScript 语言版本:ECMA - 262 Edition 5.1
Java调用JavaScript脚本
首先通过构造脚本引擎管理器 ScriptEngineManager,得到所有支持的引擎工厂,并判断是否支持JS引擎,如果支持,才可以执行JS脚本。
请参考以下完整代码:
package me.zebe.cat;
import javax.script.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
/**
* 调用JavaScript脚本演示
* @author Zebe
*/
public class CallJavaScriptDemo {
/**
* 运行入口
* @param args 运行参数
*/
public static void main(String[] args) {
// 构造一个脚本引擎管理器
ScriptEngineManager manager = new ScriptEngineManager();
// 遍历所有的引擎工厂,输出引擎工厂的信息
for (ScriptEngineFactory factory : manager.getEngineFactories()) {
String engineName = factory.getEngineName();
String engineVersion = factory.getEngineVersion();
String languageName = factory.getLanguageName();
String languageVersion = factory.getLanguageVersion();
ScriptEngine engine = factory.getScriptEngine();
System.out.println(String.format("引擎名称:%s\t引擎版本:%s\t语言名称:%s\t语言版本:%s\t",
engineName, engineVersion, languageName, languageVersion));
// 如果支持JavaScript
if ("ECMAScript".equals(languageName)) {
callSimpleJavaScript(engine);
callJavaScriptFromFile(engine);
}
}
}
/**
* 从简单字符串执行JavaScript脚本
* @param engine 脚本引擎
*/
private static void callSimpleJavaScript(ScriptEngine engine) {
try {
final String script1 = "var k = 0;";
final String script2 = "k + 5;";
System.out.println(script1 + " 的执行结果是:" + engine.eval(script1));
System.out.println(script2 + " 的执行结果是:" + engine.eval(script2));
} catch (ScriptException e) {
e.printStackTrace();
}
}
/**
* 从JavaScript文件执行JavaScript脚本
* @param engine 脚本引擎
*/
private static void callJavaScriptFromFile(ScriptEngine engine) {
try {
final String fileName = "test.js";
File file = new File(fileName);
if (file.exists()) {
System.out.println("从 " + fileName + " 的执行结果是:" + engine.eval(new FileReader(file)));
} else {
System.err.println(fileName + " 不存在,无法执行脚本");
}
} catch (ScriptException | FileNotFoundException e) {
e.printStackTrace();
}
}
}
小结
脚本引擎是一个可以执行用某种特定语言编写的脚本的类库。Java不仅可以支持对 JavaScript 的调用,还支持对其他类型的脚本调用,包括 Groovy、Ruby,甚至是更加奇异的诸如 Scheme 和 Haskell 等语言编写的脚本。本文仅作简单演示,内容中没有演示 Java 对 JavaScript 函数的调用,请读者自行研究学习。
本文原文地址:https://blog.csdn.net/zebe1989/article/details/82692160