zoukankan      html  css  js  c++  java
  • 一个神奇的类库,可以执行字符串表达式

    一种表达式语言的解析引擎JEXL ,mavne依赖如下。在做工程时候使用过

       <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-jexl</artifactId>
                <version>2.1.1</version>
            </dependency>
    

      demo:

    import java.util.HashMap;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
    import org.apache.commons.jexl.Expression;
    import org.apache.commons.jexl.ExpressionFactory;
    import org.apache.commons.jexl.JexlContext;
    import org.apache.commons.jexl.JexlHelper;
    
    ......
    
    /*
     * 初始化一个Cat对象
     */
    Cat cat = new Cat() {
    	{
    		this.setAge(2);
    		this.setName("Tom");
    		this.setOwner(new People() {
    			{
    				this.setAge(24);
    				this.setName("yang");
    			}
    		});
    	}
    };
    		
    /*
     * 初始化一个List对象,列表里存入两个元素
     *     第一个元素是一个字符串
     *     第二个元素是一个整数
     */
    List list = new ArrayList();
    list.add("Hello world !");
    list.add(11);
    
    Map map = new HashMap();
    map.put("cat", cat);
    map.put("people",cat.getOwner());
    		
    /*
     * 初始化一个JexlContext对象,它代表一个执行JEXL表达式的上下文环境
     */
    JexlContext context = JexlHelper.createContext();
    		
    /*
     * 向执行JEXL表达式的上下文环境的变量字典中存入两个变量
     *     键值 "tom" 对应变量 cat
     *     键值 "array" 对应变量 list 
     */
    context.getVars().put("tom", cat);
    context.getVars().put("array", list);
    context.getVars().put("map", map);
    /*
     * 定义要被求值的所有表达式 
     */
    String[] expressions = new String[]{
            //嵌套属性
    	"tom.owner",
    	//嵌套属性
    	"tom.owner.name",
    	//嵌套属性的方法调用,表达式求值结果为方法返回值
    	"tom.owner.name.length()",
    	"array[0].toUpperCase()",
    	//内置通用方法size(),返回String,Map和List的长度
    	"size(tom.owner.name)",
    	//返回列表中第一个元素
    	"array[0]",
    	//+ 操作符 可用于字符串的连接
    	"array[0].toUpperCase()+array[0]",
    	//内置通用方法empty(),如果为空返回true,否则返回false
    	"empty(array[0])",
    	"empty(array[2])",
    	//通过键值 'cat' 获取字典中相应的值
    	"map['cat']",
    	//嵌套属性
    	"map['people'].name.length()"
    };
    		
    //对 expressions 中所有的表达式求值
    for(String expression : expressions){
    	//用ExpressionFactory类的静态方法createExpression创建一个Expression对象
    	Expression e = ExpressionFactory.createExpression(expression);
    	//对这个Expression对象求值,传入执行JEXL表达式的上下文环境对象
    	Object obj = e.evaluate(context);
    	//输出表达式求值结果
    	System.out.println(e.getExpression()+" = "+obj);
    }
    

      

  • 相关阅读:
    前端部分框架
    Postman
    java intellij 写控制台程序 窗口程序
    postgresql 连接数
    CPU制造工艺 级选来决定cpu等级
    CPU 材料学才是最顶级的学科
    关于asp.net和iis的进程/线程问题,假如网站有1000个人访问,会产生多少个进程/线程啊
    io会消耗cpu吗?
    数据密集型 和 cpu密集型 event loop
    Javascript是一个事件驱动语言
  • 原文地址:https://www.cnblogs.com/leodaxin/p/9083930.html
Copyright © 2011-2022 走看看