当前位置: 首页 > article >正文

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;
}

http://www.kler.cn/a/517050.html

相关文章:

  • 解决docker: ‘buildx‘ is not a docker command.
  • Golang初识
  • vue3中为什么引入setup,引入setup是为了解决什么问题,setup的执行时机是什么?返回值是什么
  • linux数据压缩
  • 14-6-1C++的list
  • Elixir语言的数据结构
  • 利用现有模型处理面部视频获取特征向量(4)
  • 下载Visual Studio Community 2019
  • 科技快讯 | 2025商业新愿景;豆包大模型1.5 Pro正式发布;ChatGPT每月产生260吨二氧化碳
  • jenkins-k8s pod方式动态生成slave节点
  • 3.2 Go 返回值详解
  • ansible 批量按用户名创建kerberos主体,并分发到远程主机
  • docker 部署 java 项目详解
  • GL C++显示相机YUV视频数据使用帧缓冲FBO后期处理,实现滤镜功能。
  • Python网络爬虫中的编码乱码如何解决
  • SpringBoot使用Kafka如何保证消息不丢失
  • Qt中的connect函数
  • mysql学习笔记-数据库的设计规范
  • 在Qt中实现点击一个界面上的按钮弹窗到另一个界面
  • Xcode各个历史版本下载地址