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