Java用ScriptEngine解析脚本

转载 2015年11月06日 16:23:40

javax.script,始于JDK1.6,不过现在只有sun实现的javascript的解析器,难道是因为主要用来解析js语法所以归类到JEE的范畴?不过基本足够了,一般的用途主要是能解析通用的表达式就好,比如X >= 1(X作为参数传入)这样的表达式,也能利用js的函数语法,创造一个就像java的函数一样存在于内存中随时可以被调用的函数,更可以将js中的对象直接转换成java对象。

script包下最主要的是ScriptEngineManager、ScriptEngine、CompiledScript和Bindings 4个类或接口。

ScriptEngineManager是一个工厂的集合,可以通过name或tag的方式获取某个脚本的工厂并生成一个此脚本的ScriptEngine,目前只有javascript的工厂。通过工厂函数得到了ScriptEngine之后,就可以用这个对象来解析脚本字符串了,直接调用Object obj = ScriptEngine.eval(String script)即可,返回的obj为表达式的值,比如true、false或int值。

CompiledScript可以将ScriptEngine解析一段脚本的结果存起来,方便多次调用。只要将ScriptEngine用Compilable接口强制转换后,调用compile(String script)就返回了一个CompiledScript对象,要用的时候每次调用一下CompiledScript.eval()即可,一般适合用于js函数的使用。

Bindings的概念算稍微复杂点,我的理解Bindings是用来存放数据的容器。它有3个层级,为Global级、Engine级和Local级,前2者通过ScriptEngine.getBindings()获得,是唯一的对象,而Local Binding由ScriptEngine.createBindings()获得,很好理解,每次都产生一个新的。Global对应到工厂,Engine对应到ScriptEngine,向这2者里面加入任何数据或者编译后的脚本执行对象,在每一份新生成的Local Binding里面都会存在。

给个代码的例子,其中的functionScript可以从标准输入stdin或者配置文件等地方获得,这样就可以动态的控制Java代码的运行结果

 try{
        	ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
			Compilable compilable = (Compilable) engine;
			Bindings bindings = engine.createBindings(); // Local级别的Binding
			String script = "function add(op1,op2){return op1+op2} add(a, b)"; // 定义函数并调用
			CompiledScript JSFunction = compilable.compile(script); // 解析编译脚本函数
			bindings.put("a", 1);
			bindings.put("b", 2); // 通过Bindings加入参数
			Object result = JSFunction.eval(bindings);
			System.out.println(result); //调用缓存着的脚本函数对象,Bindings作为参数容器传入
         }catch (ScriptException e) {
        	 
         }


另外还有一个ScriptContext的概念,这个可能很少用到吧,它是用来连接ScriptEngine和Bindings的工具。按照JDK的解释:该接口的实现类被用来连接ScriptEngine和宿主应用程序中的对象(如有范围的Bindings)



ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        SimpleBindings simpleBindings = new SimpleBindings();
        String jsCript = "for(var i=0; i<test.length; i++){test[i] = test[i].replaceAll(',' , '')} ; test";
        simpleBindings.put("test", Arrays.asList("1,2,37", "1,223", "3,932"));
        Object result = engine.eval(jsCript, simpleBindings);
        System.out.println(result);


跟我一起写 Makefile(五)

六、多目标Makefile的规则中的目标可以不止一个,其支持多目标,有可能我们的多个目标同时依赖于一个文件,并且其生成的命令大体类似。于是我们就能把其合并起来。当然,多个目标的生成规则的执行命令是同一...
  • haoel
  • haoel
  • 2004-02-24 16:50:00
  • 56585

JAVA使用ScriptEngine 解析脚本

前言最近做一个功能需要把一个数学公式保存到数据库,然后通过java读取数学公式,传入参数进行计算,发现了java中的javax.script,它开始存在于JDK1.6,它可以解析通用的表达式,如三目,...
  • u014792352
  • u014792352
  • 2017-07-07 11:58:27
  • 3323

Java ScriptEngine 解析js

一、脚本语言的支持      JSR 223中规范了在Java虚拟机上运行的脚本语言与Java程序之间的交互方式。JSR 233是JavaSE6的一部分,在Java表中API中的包是javax.sc...
  • u012660667
  • u012660667
  • 2015-11-13 18:42:19
  • 7424

Java使用ScriptEngine说明

  • 2017年07月12日 10:29
  • 17KB
  • 下载

Java语言的动态性支持(一)ScriptEngineManager

一、脚本语言的支持      JSR 223中规范了在Java虚拟机上运行的脚本语言与Java程序之间的交互方式。JSR 233是JavaSE6的一部分,在Java表中API中的包是javax....
  • tbdp6411
  • tbdp6411
  • 2015-07-09 15:10:55
  • 2799

使用jython和ScriptEngineManager在java中执行python

方法一: 使用java内置的ScriptEngineManager进行python脚本调用,只要是在java6及以上即可。 1、 直接运行python语句: /** * 使用ScriptEng...
  • Anlegor
  • Anlegor
  • 2015-03-05 19:32:50
  • 3109

Nashorn jdk8新增的ScriptEngine官方文档翻译及代码示例

Nashorn js engine官方文档 jdk8的脚本引擎ScriptEngine用法说明及示例 Nashorn
  • menggudaoke
  • menggudaoke
  • 2017-09-06 17:41:00
  • 1478

JDK1.8中如何用ScriptEngine动态执行JS

ScriptEngine是jdk1.6的新功能,旨在使得jdk能动态支持脚本语言,弥补java在动态性上的不足。本文介绍了使用ScriptEngine动态执行JS的方法,给出了相关代码。希望对大家能有...
  • sinat_17612173
  • sinat_17612173
  • 2016-09-18 10:43:44
  • 704

利用ScriptEngineManager实现字符串公式灵活计算

利用ScriptEngineManager实现字符串公式灵活计算
  • wyzdeng
  • wyzdeng
  • 2017-12-03 21:51:52
  • 655

使用ScriptEngine实现两个标准json字符串对比

需求: 使用js脚本,对比两个json字符串对象。 使用API: ScriptEngine相关,主要使用ScriptEngineManager,ScriptEngine,以及接口Invocable; ...
  • sinat_35884966
  • sinat_35884966
  • 2017-08-25 16:47:07
  • 336
收藏助手
不良信息举报
您举报文章:Java用ScriptEngine解析脚本
举报原因:
原因补充:

(最多只允许输入30个字)