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;
}
相关推荐
Bunny021228 分钟前
SpringMVC笔记
java·redis·笔记
feng_blog66881 小时前
【docker-1】快速入门docker
java·docker·eureka
枫叶落雨2222 小时前
04JavaWeb——Maven-SpringBootWeb入门
java·maven
m0_748232393 小时前
SpringMVC新版本踩坑[已解决]
java
码农小灰3 小时前
Spring MVC中HandlerInterceptor和Filter的区别
java·spring·mvc
远方 hi3 小时前
linux如何修改密码,要在CentOS 7系统中修改密码
linux·运维·服务器
乔木剑衣3 小时前
Java集合学习:HashMap的原理
java·学习·哈希算法·集合
古蓬莱掌管玉米的神4 小时前
vue3语法watch与watchEffect
前端·javascript
林涧泣4 小时前
【Uniapp-Vue3】uni-icons的安装和使用
前端·vue.js·uni-app
雾恋4 小时前
AI导航工具我开源了利用node爬取了几百条数据
前端·开源·github