80 脚本引擎——js脚本引擎

Posted Scorpicat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了80 脚本引擎——js脚本引擎相关的知识,希望对你有一定的参考价值。

脚本引擎管理工具

java提供了一个脚本引擎管理工具,从这个工具可以获得各种脚本语言的脚本引擎,如js、python等。我们可以通过脚本引擎,来调用已经写好的脚本文件。相当的方便。

我们可以使用:new ScriptEngineManager()获取一个脚本引擎管理工具对象。

然后,可以通过getEngineByName(scriptName)的方式得到我们想要的脚本引擎。

//获取脚本引擎管理器
ScriptEngineManager sem = new ScriptEngineManager();
//获取js脚本引擎
ScriptEngine engine = sem.getEngineByName("js");

 

JS脚本引擎

js脚本引擎可以存储由java程序传入的js数据。如java程序通过put方法传入一个js属性,我们就可以用get方法得到这个属性。同时js脚本引擎也可以直接执行java程序传入的js代码。更为常用的是,js脚本引擎可以以Reader流的方式读取一个js文件,并运行它。下面我们来看看它的常见用法。

put方法

put(key,value)方法可以向js脚本引擎中添加js属性。

engine.put("name", "lily");

  

get方法

Object get(key)方法可以读取存储在引擎中的js属性。

System.out.println(engine.get("name"));
//运行结果
lily

  

eval方法

eval添加进的无论是String类型的js代码还是以Reader传入js文件,都会执行并存储在js脚本引擎中。

eval(String script)

以java字符串的方式传入js脚本引擎中并执行。

String aFunction = "function ff(){print(‘what hell?due?‘);}ff();";
engine.eval(aFunction);
//运行结果
what hell?due?

  

eval(Reader)

以Reader流的方式传入一个js文件到js脚本引擎并执行

//直接执行现有的js文件
	//将加载得到的URL对象获取字符输入流
FileReader fr = new FileReader("c:/newFolder/a.js");
	//通过engine.eval(Reader)执行js文件
engine.eval(fr);
	//关闭流
fr.close();

  

将js引擎作为一个java接口使用

我们可以将脚本引擎转为一个java的接口来调用保存在其中的js函数。

注意:当向js函数中传递传输时,传递的是Object对象。它是多值传参,可以使用Object数组的方式进行多值传参(将参数写在一个Object数组中,在单独传入这个数组),也可以直接传递多个Object对象。

//将引擎作为借口调用引擎中存储的js代码中的函数
			//先添加一个函数
		engine.eval("function returnWhatYouInput(a){return a;}");
			//将engine转为Invocable的引用
		Invocable jsInvoke = (Invocable)engine;
		Object result = jsInvoke.invokeFunction("returnWhatYouInput", new Object[]{"sick"});//多值传参Object类型,如只传一个可以这样写,也可以传已经创建好的Object引用
		System.out.println(result);

  

js引擎中引入Java工具的方法

//js脚本中引入java包的方法
engine.eval("var list = java.util.Arrays.asList("你","我")");//就是这一行,示例为传入java.util.Arrays工具
List<String> list = (List<String>) engine.get("list");
for(String s : list){
	System.out.println(s);
}

  

完整代码

package _20200105_ScriptEngine;

import java.io.FileReader;
import java.util.List;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Demo02 {
	public static void main(String[] args) throws Exception{
		//获取脚本引擎管理器
		ScriptEngineManager sem = new ScriptEngineManager();
		//获取js脚本引擎
		ScriptEngine engine = sem.getEngineByName("js");
		//向引擎中添加js代码
		engine.put("name", "lily");
		//直接执行java字符串类型的js代码
		String aFunction = "function ff(){print(‘what hell?due?‘);}ff();";
		engine.eval(aFunction);
		//读取引擎中存储的js代码中的属性
		System.out.println(engine.get("name"));
		//将引擎作为借口调用引擎中存储的js代码中的函数
			//先写一个函数
		engine.eval("function returnWhatYouInput(a){return a;}");
			//将engine转为Invocable的引用
		Invocable jsInvoke = (Invocable)engine;
		Object result = jsInvoke.invokeFunction("returnWhatYouInput", new Object[]{"sick"});//多值传参Object类型,如只传一个可以这样写,也可以传已经创建好的Object引用
		System.out.println(result);
		//js脚本中引入java包的方法
		engine.eval("var list = java.util.Arrays.asList("你","我")");
		List<String> list = (List<String>) engine.get("list");
		for(String s : list){
			System.out.println(s);
		}
		//直接执行现有的js文件
			//将加载得到的URL对象获取字符输入流
		FileReader fr = new FileReader("c:/newFolder/a.js");
			//通过engine.eval(Reader)执行js文件
		engine.eval(fr);
			//关闭流
		fr.close();
	}
}

  

运行结果

其中1120是js文件中的一个属性。

what hell?due?
lily
sick
你
我
invoke js file:7
1120

  

以上是关于80 脚本引擎——js脚本引擎的主要内容,如果未能解决你的问题,请参考以下文章

JS引擎线程的执行过程的三个阶段

Auto.js中的脚本引擎

Auto.js中的脚本引擎

Auto.js中的脚本引擎

Java 8 的 Nashorn 脚本引擎教程

基于V8引擎的C++和JS的相互交互