Java中使用JavaScript脚本

我们两清 提交于 2020-03-30 15:01:39
简介 Nashorn

Nashorn 一个 javascript 引擎。
从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引擎。Nashorn完全支持ECMAScript 5.1规范以及一些扩展。
它使用基于JSR 292的新语言特性,其中包含在JDK 7中引入的 invokedynamic,将JavaScript编译成Java字节码。
与先前的Rhino实现相比,这带来了2到10倍的性能提升。

使用方式
  1. 编写JavaScript脚本
    列:JavaScript方法使用Java对象执行方法获取返回值。
function scriptFunction(obj){
	var a = 1;
	var b = 2;
	return obj.sum(a,b);
}
scriptFunction(obj);//调用该方法

该脚本变量定义为 String script1;
2. 创建JavaScript容器用户存储脚本 ScirptContainer.java

public class ScirptContainer {
	
	
	public static ScriptEngine engine;//脚本引擎
	
	static {
		ScriptEngineManager manager = new ScriptEngineManager();//脚本引擎管理
		engine = manager.getEngineByName("nashorn");//获取nashorn脚本引擎
		engine.getContext().getWriter();//获取正文并且写入
	}
	
	private ConcurrentHashMap<Integer, CompiledScript> scripts = new ConcurrentHashMap<>();//脚本存储容器
	
	
	public CompiledScript getCompiledScript(String script) throws ScriptException{
		//判断脚本是否为空
		if(script == null || "".equals(script)){
			throw new ScriptException("JavaScript empty");
		}
		//获取脚本Hash
		int hashCode = script.hashCode();
		//从容器中获取脚本
		CompiledScript compiledScript = scripts.get(hashCode);
		if(compiledScript == null){
			//容器中无脚本创建脚本对象
			Compilable compilable = (Compilable) engine;
			//编译JavaScript脚本
			compiledScript = compilable.compile(script);
			//脚本对象存入容器中
			scripts.put(hashCode, compiledScript);
		}
		return compiledScript;
	}
	
}
  1. Java执行JavaScript脚本
public class ScriptHandler {
	
	//创建容器对象
	private ScirptContainer scirptContainer = new ScirptContainer();
	
	//需要执行的对象
	String js1 = "function scriptFunction(obj){  var a = 1; var b = 2; return obj.sum(a,b); } scriptFunction(obj);";
	
	@Test
	public void test() throws ScriptException{
		//获取脚本对象
		CompiledScript c1 = scirptContainer.getCompiledScript(js1);
		//创建参数绑定
		Bindings bindings = scirptContainer.engine.createBindings();
		//obj参数绑定SumTest类
		bindings.put("obj", new SumTest());
		//执行JavaScript脚本并且打印返回值
		System.out.println(c1.eval(bindings));
	}
}

注意事项:

  1. 脚本中scriptFunction(obj);是必须存在,否则不会执行方法.
  2. 脚本中可以创建Java对象,需要全类名如var map = new java.util.HashMap();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!