欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > AviatorScript用法

AviatorScript用法

2026/5/1 22:47:04 来源:https://blog.csdn.net/qq_30299243/article/details/145324704  浏览:    关键词: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对的方式塞入,最终还是mapfinal 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对的方式塞入,最终还是mapfinal 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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com