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;
}
相关推荐
Theodore_1022几秒前
ES6(8) Fetch API 详解
开发语言·前端·javascript·ecmascript·es6
Naive_79 分钟前
蓝桥杯准备(前缀和差分)
java·职场和发展·蓝桥杯
月明长歌9 分钟前
Vue + Axios + Mock.js 全链路实操:从封装到数据模拟的深度解析
前端·javascript·vue.js·elementui·es6
xujiangyan_17 分钟前
nginx的反向代理和负载均衡
服务器·网络·nginx
CodeCraft Studio19 分钟前
Excel处理控件Spire.XLS系列教程:C# 合并、或取消合并 Excel 单元格
前端·c#·excel
头顶秃成一缕光30 分钟前
若依——基于AI+若依框架的实战项目(实战篇(下))
java·前端·vue.js·elementui·aigc
冴羽yayujs34 分钟前
SvelteKit 最新中文文档教程(17)—— 仅服务端模块和快照
前端·javascript·vue.js·前端框架·react
GalaxyPokemon44 分钟前
Muduo网络库实现 [十] - EventLoopThreadPool模块
linux·服务器·网络·c++
木木黄木木1 小时前
HTML5图片裁剪工具实现详解
前端·html·html5
念九_ysl1 小时前
基数排序算法解析与TypeScript实现
前端·算法·typescript·排序算法