表达式引擎aviatorscript简单案例

摘要

本文主要介绍Aviator表达式引擎的简单使用。Aviator 的基本过程是将表达式直接翻译成对应的 java 字节码执行,整个过程最多扫两趟(开启执行优先模式,如果是编译优先模式下就一趟),这样就保证了它的性能超越绝大部分解释性的表达式引擎。

文档地址

案例

最常用的案例是自定义函数,和Java静态方法的调用

hello world案例

java 复制代码
public static void hello() throws Exception {
        // Compile the script into a Expression instance.
        Object execute = AviatorEvaluator.getInstance().execute("println(\"hello, AviatorScript!\"); return 1+1;");
        System.out.println(execute);
        // Run the exprssion.
    }
    
public static void main(String[] args) throws Exception {
    hello();
}
  • 结果

    hello, AviatorScript!
    2

自定义函数

自定义函数可以嵌套使用,下面会给出案例

RandomFunction随机数函数

typescript 复制代码
public class RandomFunction extends AbstractFunction {
    @Override
    public String getName() {
        return "RANDOM";
    }

    @Override
    public AviatorObject call(Map<String, Object> env) {
        Random random = new Random();
        int i = random.nextInt();
        System.out.println(i);
        return new AviatorBigInt(i);
    }
}

IdValueFunction

typescript 复制代码
public class IdValueFunction extends AbstractFunction {

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

    @Override
    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3) {
        // 做示例,ID和VALUE 的SQL转换
        String sql = "select " + FunctionUtils.getStringValue(arg3, env) + " from " + FunctionUtils.getStringValue(arg1, env) + " where id = " + FunctionUtils.getNumberValue(arg2, env);
        System.out.println(sql);
        return new AviatorString("");
    }
}

案例

ID_VALUE("user", RANDOM(), "address"),这个嵌套的自定义函数,会按照优先级处理,先执行RANDOM(),然后再执行外层,和java的优先级一样

python 复制代码
public static void idValue(){
    //注册函数
    AviatorEvaluatorInstance aviatorEvaluatorInstance = AviatorEvaluator.newInstance();
    aviatorEvaluatorInstance.addFunction(new IdValueFunction());
    aviatorEvaluatorInstance.addFunction(new RandomFunction());
    System.out.println(aviatorEvaluatorInstance.execute("1 + 1"));
    System.out.println(aviatorEvaluatorInstance.execute("ID_VALUE("user", 2, "address")"));
    System.out.println(aviatorEvaluatorInstance.execute("RANDOM()"));
    System.out.println(aviatorEvaluatorInstance.execute("ID_VALUE("user", RANDOM(), "address")"));
}

public static void main(String[] args) throws Exception {
    idValue();
}
  • 结果
sql 复制代码
2
select address from user where id = 2

-1686908330
-1686908330
2114856895
select address from user where id = 2114856895

调用java静态方法

static_method.av脚本

ini 复制代码
use java.util.regex.Pattern;

let p = Pattern.compile("\\d+");

if "123" =~ p {
  p("matched");
  p($0);
}

if "a123" =~ p {
  p("matched");
  p($0);
}

方法主体

java 复制代码
public static void staticValue () throws Exception {
        AviatorEvaluatorInstance aviatorEvaluatorInstance = AviatorEvaluator.newInstance();
        aviatorEvaluatorInstance.addStaticFunctions("str", StrUtil.class);
        Object execute = aviatorEvaluatorInstance.execute("str.blankToDefault('','abc')");
        System.out.println(execute);
    }

    public static void staticValue2() throws Exception{
        Expression exp = AviatorEvaluator.getInstance().compileScript("./static_method.av");
        // Run the exprssion.
        exp.execute();
    }

public static void main(String[] args) throws Exception {

        staticValue();
        staticValue2();
    }
  • 结果

    abc
    matched
    123

最后

该表达式引擎比较强大,而且上手难度也比较低,更多功能就参照官方文档来使用吧。

相关推荐
计算机毕设指导629 分钟前
基于Springboot学生宿舍水电信息管理系统【附源码】
java·spring boot·后端·mysql·spring·tomcat·maven
计算机-秋大田36 分钟前
基于Spring Boot的兴顺物流管理系统设计与实现(LW+源码+讲解)
java·vue.js·spring boot·后端·spring·课程设计
羊小猪~~2 小时前
MYSQL学习笔记(九):MYSQL表的“增删改查”
数据库·笔记·后端·sql·学习·mysql·考研
豌豆花下猫2 小时前
Python 潮流周刊#90:uv 一周岁了,优缺点分析(摘要)
后端·python·ai
橘猫云计算机设计3 小时前
基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!
java·数据库·spring boot·后端·python·计算机网络·毕设
熬夜苦读学习3 小时前
Linux文件系统
linux·运维·服务器·开发语言·后端
坚定信念,勇往无前4 小时前
Spring Boot 如何保证接口安全
spring boot·后端·安全
程序员侠客行5 小时前
Spring事务原理详解 三
java·后端·spring·架构
Hello.Reader6 小时前
深入理解 Rust 的 `Rc<T>`:实现多所有权的智能指针
开发语言·后端·rust
yoona10206 小时前
Rust编程语言入门教程(八)所有权 Stack vs Heap
开发语言·后端·rust·区块链·学习方法