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;
}
相关推荐
普if加的帕2 分钟前
java Springboot使用扣子Coze实现实时音频对话智能客服
java·开发语言·人工智能·spring boot·实时音视频·智能客服
我的作业错错错6 分钟前
搭建私人网站
服务器·阿里云·私人网站
拉不动的猪15 分钟前
前端自做埋点,我们应该要注意的几个问题
前端·javascript·面试
爱喝一杯白开水16 分钟前
SpringMVC从入门到上手-全面讲解SpringMVC的使用.
java·spring·springmvc
王景程25 分钟前
如何测试短信接口
java·服务器·前端
安冬的码畜日常1 小时前
【AI 加持下的 Python 编程实战 2_10】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(中)
开发语言·前端·人工智能·ai·扫雷游戏·ai辅助编程·辅助编程
小杨升级打怪中1 小时前
前端面经-JS篇(三)--事件、性能优化、防抖与节流
前端·javascript·xss
清风细雨_林木木1 小时前
Vue开发网站会有“#”原因是前端路由使用了 Hash 模式
前端·vue.js·哈希算法
微网兔子1 小时前
伺服器用什么语言开发呢?做什么用什么?
服务器·c++·后端·游戏
zhang23839061541 小时前
IDEA add gitlab account 提示
java·gitlab·intellij-idea·idea