摘要
本文主要介绍
Aviator
表达式引擎的简单使用。Aviator 的基本过程是将表达式直接翻译成对应的 java 字节码执行,整个过程最多扫两趟(开启执行优先模式,如果是编译优先模式下就一趟),这样就保证了它的性能超越绝大部分解释性的表达式引擎。
文档地址
案例
最常用的案例是自定义函数,和
Java
静态方法的调用
hello world
案例
java
public static void hello() throws Exception {
// Compile the script into a Expression instance.
Object execute = AviatorEvaluator.getInstance().execute("println(\"hello, AviatorScript!\"); return 1+1;");
System.out.println(execute);
// Run the exprssion.
}
public static void main(String[] args) throws Exception {
hello();
}
-
结果
hello, AviatorScript!
2
自定义函数
自定义函数可以嵌套使用,下面会给出案例
RandomFunction
随机数函数
typescript
public class RandomFunction extends AbstractFunction {
@Override
public String getName() {
return "RANDOM";
}
@Override
public AviatorObject call(Map<String, Object> env) {
Random random = new Random();
int i = random.nextInt();
System.out.println(i);
return new AviatorBigInt(i);
}
}
IdValueFunction
typescript
public class IdValueFunction extends AbstractFunction {
@Override
public String getName() {
return "ID_VALUE";
}
@Override
public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3) {
// 做示例,ID和VALUE 的SQL转换
String sql = "select " + FunctionUtils.getStringValue(arg3, env) + " from " + FunctionUtils.getStringValue(arg1, env) + " where id = " + FunctionUtils.getNumberValue(arg2, env);
System.out.println(sql);
return new AviatorString("");
}
}
案例
ID_VALUE("user", RANDOM(), "address")
,这个嵌套的自定义函数,会按照优先级处理,先执行RANDOM()
,然后再执行外层,和java
的优先级一样
python
public static void idValue(){
//注册函数
AviatorEvaluatorInstance aviatorEvaluatorInstance = AviatorEvaluator.newInstance();
aviatorEvaluatorInstance.addFunction(new IdValueFunction());
aviatorEvaluatorInstance.addFunction(new RandomFunction());
System.out.println(aviatorEvaluatorInstance.execute("1 + 1"));
System.out.println(aviatorEvaluatorInstance.execute("ID_VALUE("user", 2, "address")"));
System.out.println(aviatorEvaluatorInstance.execute("RANDOM()"));
System.out.println(aviatorEvaluatorInstance.execute("ID_VALUE("user", RANDOM(), "address")"));
}
public static void main(String[] args) throws Exception {
idValue();
}
- 结果
sql
2
select address from user where id = 2
-1686908330
-1686908330
2114856895
select address from user where id = 2114856895
调用java
静态方法
static_method.av
脚本
ini
use java.util.regex.Pattern;
let p = Pattern.compile("\\d+");
if "123" =~ p {
p("matched");
p($0);
}
if "a123" =~ p {
p("matched");
p($0);
}
方法主体
java
public static void staticValue () throws Exception {
AviatorEvaluatorInstance aviatorEvaluatorInstance = AviatorEvaluator.newInstance();
aviatorEvaluatorInstance.addStaticFunctions("str", StrUtil.class);
Object execute = aviatorEvaluatorInstance.execute("str.blankToDefault('','abc')");
System.out.println(execute);
}
public static void staticValue2() throws Exception{
Expression exp = AviatorEvaluator.getInstance().compileScript("./static_method.av");
// Run the exprssion.
exp.execute();
}
public static void main(String[] args) throws Exception {
staticValue();
staticValue2();
}
-
结果
abc
matched
123
最后
该表达式引擎比较强大,而且上手难度也比较低,更多功能就参照官方文档来使用吧。