博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java平台的内嵌脚本支持JSR223以及commons-jexl简单使用
阅读量:4048 次
发布时间:2019-05-25

本文共 4120 字,大约阅读时间需要 13 分钟。

前言

JDK6加入对JSR233-Java平台脚本的支持( ),可以用来在Java程序中调用脚本。

 

1.支持的脚本类型

 

import javax.script.ScriptEngineFactory;import javax.script.ScriptEngineManager;import java.util.List;public class TestSupport {    public static void main(String[] args) {        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();        List
engineFactories = scriptEngineManager.getEngineFactories(); if (engineFactories.size() == 0) { System.out.println("本JVM尚不支持任何脚本引擎"); return; } System.out.println("本JVM支持的脚本引擎有:"); for (ScriptEngineFactory engineFactory : engineFactories) { System.out.println("引擎名称:" + engineFactory.getEngineName()); System.out.println("\t可被ScriptEngineManager识别的名称:" + engineFactory.getNames()); System.out.println("\t该引擎支持的脚本语言名称:" + engineFactory.getLanguageName()); System.out.println("\t是否线程安全:" + engineFactory.getParameter("THREADING")); } }}

 

 

 

2.DEMO

 

import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;public class TestScript1 {    public static void main(String[] args) throws Exception {        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();        ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript");        String exp = "c=a+b;if(c<0){'负数'}else if(c==0){'零'}else{c};";        scriptEngine.put("a", Math.random()*(-10));        scriptEngine.put("b", Math.random()*10);        Object result = scriptEngine.eval(exp);        System.out.println(exp + " === " + result);    }}

 

 

2.commons-jexl

Apache commons-jexl是基于JSR233的扩展库,只需添加依赖就可以使用。

(1)Maven Dependency

 

org.apache.commons
commons-jexl
2.1.1

 

 

(2)DEMO

import java.util.Date;public class Pojo {    private String str;    private Integer inte;    private Boolean bool;    private Date date;    public Pojo(String str, Integer inte, Boolean bool, Date date) {        this.str = str;        this.inte = inte;        this.bool = bool;        this.date = date;    }    public String getStr() {        return str;    }    public void setStr(String str) {        this.str = str;    }    public Integer getInte() {        return inte;    }    public void setInte(Integer inte) {        this.inte = inte;    }    public Boolean getBool() {        return bool;    }    public void setBool(Boolean bool) {        this.bool = bool;    }    public Date getDate() {        return date;    }    public void setDate(Date date) {        this.date = date;    }}

 

import com.google.common.collect.Lists;import com.google.common.collect.Maps;import org.apache.commons.jexl2.Expression;import org.apache.commons.jexl2.JexlContext;import org.apache.commons.jexl2.JexlEngine;import org.apache.commons.jexl2.MapContext;import java.util.Date;import java.util.List;import java.util.Map;public class TestJexl {    public static void main(String[] args) {        /**         * 新建或取回JexlEngine         */        JexlEngine jexl = new JexlEngine();        /**         * 初始化一个JexlContext对象,它代表一个执行JEXL表达式的上下文环境         */        JexlContext context = new MapContext();        // 准备并设置JEXL表达式上下文环境        Pojo pojo = new Pojo("Pojo", 123, true, new Date());        List
list = Lists.newArrayList("a1", "", "c3"); Map
map = Maps.newHashMap(); map.put("key", "value"); map.put("pojo", pojo); context.set("pojo", pojo); context.set("list", list); context.set("map", map); // 准备表达式 List
jexlExps = Lists.newArrayList("pojo.str", "pojo.inte", "pojo.bool", "pojo.date" , "size(list)", "list[0].length()", "list[0].toUpperCase()", "empty(list[1])" , "map['key']", "map['pojo'].str"); // 执行表达式 for (String jexlExp : jexlExps) { // 建立表达式对象 Create expression object Expression expression = jexl.createExpression(jexlExp); // 传入上下文环境并执行 Object obj = expression.evaluate(context); System.out.println(expression.getExpression() + " = " + obj); } }}

 

 

 

 

 

 

 

转载地址:http://tqyci.baihongyu.com/

你可能感兴趣的文章
关于进制转换的具体实现代码
查看>>
Golang 数据可视化利器 go-echarts ,实际使用
查看>>
mysql 跨机器查询,使用dblink
查看>>
mysql5.6.34 升级到mysql5.7.32
查看>>
dba 常用查询
查看>>
Oracle 异机恢复
查看>>
Oracle 12C DG 搭建(RAC-RAC/RAC-单机)
查看>>
Truncate 表之恢复
查看>>
Oracle DG failover 后恢复
查看>>
mysql 主从同步配置
查看>>
为什么很多程序员都选择跳槽?
查看>>
mongdb介绍
查看>>
mongdb在java中的应用
查看>>
区块链技术让Yotta企业云盘为行政事业服务助力
查看>>
Yotta企业云盘更好的为媒体广告业服务
查看>>
Yotta企业云盘助力旅游行业新发展
查看>>
Yotta企业云盘助力科技行业创高峰
查看>>
Yotta企业云盘更好地为教育行业服务
查看>>
Yotta企业云盘怎么帮助到能源化工行业
查看>>
企业云盘如何助力商业新发展
查看>>