Aviator 是一个轻量级、高性能的 Java 表达式执行引擎,它动态地将表达式编译成字节码并运行。
特性:
- 支持数字、字符串、正则、运算符等等
- 支持函数
- 内置 bigint
- ASM 模式可直接将脚本编译成 JVM 字节码
使用
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>{version}</version>
</dependency>
最简单直观的使用:
import com.googlecode.aviator.AviatorEvaluator;
public class TestAviator {
public static void main(String[] args) {
Long result = (Long) AviatorEvaluator.execute("1+2+3");
System.out.println(result);
}
}
更加复杂的使用方式可以参考 wiki,文档已经足够详细,不再重复。
源码解析
执行表达式
主要接口
AviatorEvaluator 最重要的方法:
execute(String expression)
execute(String expression, Map<String,Object> env)
execute(String expression, Map<String,Object> env, boolean cached)
这些方法用来执行表达式,并获取结果。围绕这个方法也有可以传入变量的 exec
方法
exec(String expression, Object... values)
内置方法和自定义方法
自定义方法
主要可以分为以下几大类,包括数学计算相关,字符串处理相关
数学计算
MathAbsFunction
MathCosFunction
MathLog10Function
MathLogFunction
MathPowFunction
MathRoundFunction
MathSinFunction
MathSqrtFunction
MathTanFunction
字符串相关
StringContainsFunction
StringEndsWithFunction
StringIndexOfFunction
StringJoinFunction
StringLengthFunction
StringReplaceAllFunction
StringReplaceFirstFunction
StringSplitFunction
StringStartsWithFunction
StringSubStringFunction
序列相关方法
SeqCompsitePredFunFunction
SeqCountFunction # count(list) 长度
SeqFilterFunction # 过滤
SeqIncludeFunction # 是否在序列中
SeqMakePredicateFunFunction
SeqMapFunction # 遍历序列
SeqPredicateFunction
SeqReduceFunction # 求和
SeqSortFunction
SeqEveryFunction # 每个都满足
SeqNotAnyFunction # 不在
SeqSomeFunction # 序列中一个元素满足
额外的方法
BinaryFunction
BooleanFunction
Date2StringFunction
DateFormatCache
DoubleFunction
LongFunction
NowFunction
PrintFunction
PrintlnFunction
RandomFunction
StrFunction
String2DateFunction
SysDateFunction
表达式语法解析
FakeCodeGenerator
演示将中缀表达式转换为后缀表达式