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