Java表达式执行引擎 —— Aviator 快速入门

简介

Aviator是一个轻量级、高性能的Java表达式执行引擎。用于各种表达式的动态求值。

Aviator依赖了commons-beanutils,Aviator非常小, 加上依赖包也才450K,不算依赖包的话只有 70K。使用Aviator可以添加下面的maven依赖:

        <dependency>
            <groupId>com.googlecode.aviator</groupId>
            <artifactId>aviator</artifactId>
            <version>3.0.1</version>
        </dependency>

示例

    public static void main(String[] args) {
        tryEvaluator(5);
        tryVar();
        tryCompare();
        tryCustomFunction();
    }

    /**
     * 提取 对象/属性
     */
    private static void tryEvaluatorObj() {
        Map<String, Object> env = new HashMap<String, Object>();
        env.put("p", new PersonDO("yuan",1));

        Object p =  AviatorEvaluator.execute("p", env);
        Object name =  AviatorEvaluator.execute("p.name", env);
        Object age =  AviatorEvaluator.execute("p.age", env);
        // true
        System.out.println(p);
        System.out.println(name);
        System.out.println(age);
    }
    /**
     * 条件判断
     *
     * @param limit
     */
    private static void tryEvaluator(int limit) {
        Map<String, Object> env = new HashMap<String, Object>();
        env.put("limit", limit);
        boolean result = (boolean) AviatorEvaluator.execute("limit==5", env);
        // true
        System.out.println(result);
    }

    /**
     * 多变量使用
     */
    private static void tryVar() {
        String result = (String) AviatorEvaluator.exec("'hello '+yourName+', I am '+myName", "Tom", "Jerry");
        // hello Tom, I am Jerry
        System.out.println(result);
    }

    /**
     * 数据比较
     */
    private static void tryCompare() {
        Map<String, Object> env = new HashMap<String, Object>();

        Map<String, Object> objA = new HashMap<>();
        objA.put("state", 2);
        objA.put("code", "hhxx");

        Map<String, Object> objB = new HashMap<>();
        objB.put("status", 3);
        objB.put("code", "hhxxTTXS");

        env.put("a", objA);
        env.put("b", objB);


        boolean result = (boolean) AviatorEvaluator.execute("a.state<b.status || a.code==b.code", env);

        // true
        System.out.println(result);
    }

    /**
     * 自定义函数
     */
    private static void tryCustomFunction() {
        //注册函数
        AviatorEvaluator.addFunction(new AddFunction());
        // 3.0
        System.out.println(AviatorEvaluator.execute("add(1, 2)"));
        // 521.0
        System.out.println(AviatorEvaluator.execute("add(add(1, 20), 500)"));
    }

    static class AddFunction extends AbstractFunction {
        @Override
        public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2) {
            Number left = FunctionUtils.getNumberValue(arg1, env);
            Number right = FunctionUtils.getNumberValue(arg2, env);
            return new AviatorDouble(left.doubleValue() + right.doubleValue());
        }

        @Override
        public String getName() {
            return "add";
        }
    }

Reference

  • https://my.oschina.net/kings0/blog/4710642
  • https://github.com/killme2008/aviatorscript

版权声明:本文为fgszdgbzdb原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。