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);
    }
    

      

  • 相关阅读:
    在JavaWeb中使用Log4j步骤
    关于我为什么不再更新博客园了
    windows termial 配置文件
    windows10 命令行修复系统引导
    vscode修改code runner插件默认使用的编译器
    windows下vscode修复c++找不到头文件
    windows下安装mingw-w64
    vscode美化方法以及定制主题插件
    windows下隐藏磁盘分区
    2018 icpc 徐州网络赛 F Features Track
  • 原文地址:https://www.cnblogs.com/leodaxin/p/9083930.html
Copyright © 2011-2022 走看看