AviatorScript用法

AviatorScript的介绍,网上有很多,这里就不啰嗦了。这里介绍下传参的用法

应用场景:如果不想频繁的打包升级,而是想只更新某些规则脚本重启服务就可以升级的话,AviatorScript无疑是最佳选择。比如说,今天制定一套规则,明天可能还要改,后天可能就不用了。为了不必要的打包,可以使用AviatorScript。

代码如下:

依赖:

复制代码
<dependency>
    <groupId>com.googlecode.aviator</groupId>
    <artifactId>aviator</artifactId>
    <version>5.3.3</version>
</dependency>

创建av文件,可根据自己的情况自定义位置

复制代码
我们在使用的时候,可能只是简单的传递几个参数,经过av文件里的计算就可以返回结果,方法如下:
/**
 * 简单的参数
 */
public static void simpleParameters() throws IOException {
    Expression compiledExp = AviatorEvaluator.getInstance().compileScript(path1, true);
    //执行脚本,参数可以map,也可以通过newEnv kv对的方式塞入,最终还是map
    final Object o = compiledExp.execute(compiledExp.newEnv("age", 12, "name", "李四"));
    System.out.println(o);
}

av文件代码如下:

复制代码
str = "";
if (age <=1 ){
  str = "婴儿";
} elsif (age>1 && age<=6) {
   str = "儿童";
} elsif (age>6 && age<=17) {
  str = "青少年";
} elsif (age>18 && age<=40){
  str = "青年";
} elsif (age>40 && age<=48){
  str = "壮年";
} elsif (age>48 && age<=65){
  str = "中年";
} elsif (age>65){
  str = "老年";
}
str = name + "年龄" + age + "岁,处在" + str + "期";
return str;

执行结果如下:

有时候我们需要复杂的参数。实例类里嵌套实体类,方法如下:

复制代码
/**
 * 复杂的参数
 * @throws IllegalAccessException
 * @throws NoSuchMethodException
 * @throws IOException
 */
public static void ComplexParameters() throws IllegalAccessException, NoSuchMethodException, IOException {
    TestBean testBean = new TestBean();
    List<String> sss = new ArrayList<>();
    sss.add("11");
    sss.add("22");
    sss.add("33");
    ChildBean childBean = new ChildBean();
    childBean.setStringList(sss);
    List<ChildBean> childBeans = new ArrayList<>();
    childBeans.add(childBean);
    testBean.setStringList(childBeans);
    // av文件里的 我们使用变量名称定义,可以定义多个。也就是说,在av文件里需要初始化一个变量,代表后面的实体类
    AviatorEvaluator.addInstanceFunctions("testBeanIns", TestBean.class);
    AviatorEvaluator.addInstanceFunctions("childBeanIns", ChildBean.class);
    // 读取文件
    Expression exp = AviatorEvaluator.getInstance().compileScript(path, true);
    Map<String, Object> env = new HashMap<String, Object>();
    // 传递参数 并 命名,可以传递多个
    env.put("testBean", testBean);
    env.put("childBean", childBean);
    Object execute = exp.execute(env);
    System.out.println(execute);
}

av文件如下:

复制代码
## 定义一个集合
let list = testBeanIns.getStringList(testBean);
let childlist = childBeanIns.getStringList(childBean);
println("childlist>>>>" + childlist);
let a = 0;
for i in list{
    let name = childBeanIns.getName(i);
    println("testBean 里的子集合中的名字:" + name);
    let list1 = childBeanIns.getStringList(i);
    return list1;
}

结果如下:

所有的代码文件

复制代码
package com.example.aviator;

import com.example.bean.TestBean;
import com.example.bean.ChildBean;
import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Expression;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @author lake
 * @date 2025/1/16
 */
public class Test {
    static String path = "script/hello.av";
    static String path1 = "script/calculation.av";

    public static void main(String[] args) throws IOException, IllegalAccessException, NoSuchMethodException {
        simpleParameters();
        ComplexParameters();
    }


    /**
     * 简单的参数
     */
    public static void simpleParameters() throws IOException {
        Expression compiledExp = AviatorEvaluator.getInstance().compileScript(path1, true);
        //执行脚本,参数可以map,也可以通过newEnv kv对的方式塞入,最终还是map
        final Object o = compiledExp.execute(compiledExp.newEnv("age", 12, "name", "李四"));
        System.out.println(o);
    }

    /**
     * 复杂的参数
     * @throws IllegalAccessException
     * @throws NoSuchMethodException
     * @throws IOException
     */
    public static void ComplexParameters() throws IllegalAccessException, NoSuchMethodException, IOException {
        TestBean testBean = new TestBean();
        List<String> sss = new ArrayList<>();
        sss.add("11");
        sss.add("22");
        sss.add("33");
        ChildBean childBean = new ChildBean();
        childBean.setStringList(sss);
        List<ChildBean> childBeans = new ArrayList<>();
        childBeans.add(childBean);
        testBean.setStringList(childBeans);
        // av文件里的 我们使用变量名称定义,可以定义多个。也就是说,在av文件里需要初始化一个变量,代表后面的实体类
        AviatorEvaluator.addInstanceFunctions("testBeanIns", TestBean.class);
        AviatorEvaluator.addInstanceFunctions("childBeanIns", ChildBean.class);
        // 读取文件
        Expression exp = AviatorEvaluator.getInstance().compileScript(path, true);
        Map<String, Object> env = new HashMap<String, Object>();
        // 传递参数 并 命名,可以传递多个
        env.put("testBean", testBean);
        env.put("childBean", childBean);
        Object execute = exp.execute(env);
        System.out.println(execute);
    }
}

实体类:

复制代码
import lombok.Data;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
@Data
public class TestBean {
    private String name = "A";
    private String sex = "B";
    private List<ChildBean> stringList;
}
复制代码
import lombok.Data;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
@Data
public class ChildBean {
    private String name = "张三";
    private List<String> stringList;
}
相关推荐
茂桑2 分钟前
MVCC(多版本并发控制)
java·开发语言·数据库
不良人天码星15 分钟前
Linux的基础指令和环境部署,项目部署实战(下)
linux·运维·服务器
customer0818 分钟前
【开源免费】基于SpringBoot+Vue.JS医疗报销系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
道不尽世间的沧桑20 分钟前
第9篇:插槽(Slots)的使用
前端·javascript·vue.js
bin915323 分钟前
DeepSeek 助力 Vue 开发:打造丝滑的滑块(Slider)
前端·javascript·vue.js·前端框架·ecmascript·deepseek
barcke26 分钟前
【深度解析】Java接入DeepSeek大模型:从零实现流式对话+多轮会话管理(完整项目实战) —— SpringBoot整合、API安全封装、性能优化全攻略
java·spring boot
zl97989938 分钟前
MybatisPlus-注解
java·spring·maven
uhakadotcom40 分钟前
最新发布的Tailwind CSS v4.0提供了什么新能力?
前端
杰九1 小时前
【环境配置】maven,mysql,node.js,vue的快速配置与上手
java·vue.js·spring boot·mysql·node.js·maven
GISer_Jing1 小时前
Node.js中如何修改全局变量的几种方式
前端·javascript·node.js