简介
Aviator是一个轻量级、高性能的Java表达式执行引擎。用于各种表达式的动态求值。
Aviator依赖了commons-beanutils,Aviator非常小, 加上依赖包也才450K,不算依赖包的话只有 70K。使用Aviator可以添加下面的maven依赖:
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>3.0.1</version>
</dependency>
示例
public static void main(String[] args) {
tryEvaluator(5);
tryVar();
tryCompare();
tryCustomFunction();
}
/**
* 提取 对象/属性
*/
private static void tryEvaluatorObj() {
Map<String, Object> env = new HashMap<String, Object>();
env.put("p", new PersonDO("yuan",1));
Object p = AviatorEvaluator.execute("p", env);
Object name = AviatorEvaluator.execute("p.name", env);
Object age = AviatorEvaluator.execute("p.age", env);
// true
System.out.println(p);
System.out.println(name);
System.out.println(age);
}
/**
* 条件判断
*
* @param limit
*/
private static void tryEvaluator(int limit) {
Map<String, Object> env = new HashMap<String, Object>();
env.put("limit", limit);
boolean result = (boolean) AviatorEvaluator.execute("limit==5", env);
// true
System.out.println(result);
}
/**
* 多变量使用
*/
private static void tryVar() {
String result = (String) AviatorEvaluator.exec("'hello '+yourName+', I am '+myName", "Tom", "Jerry");
// hello Tom, I am Jerry
System.out.println(result);
}
/**
* 数据比较
*/
private static void tryCompare() {
Map<String, Object> env = new HashMap<String, Object>();
Map<String, Object> objA = new HashMap<>();
objA.put("state", 2);
objA.put("code", "hhxx");
Map<String, Object> objB = new HashMap<>();
objB.put("status", 3);
objB.put("code", "hhxxTTXS");
env.put("a", objA);
env.put("b", objB);
boolean result = (boolean) AviatorEvaluator.execute("a.state<b.status || a.code==b.code", env);
// true
System.out.println(result);
}
/**
* 自定义函数
*/
private static void tryCustomFunction() {
//注册函数
AviatorEvaluator.addFunction(new AddFunction());
// 3.0
System.out.println(AviatorEvaluator.execute("add(1, 2)"));
// 521.0
System.out.println(AviatorEvaluator.execute("add(add(1, 20), 500)"));
}
static class AddFunction extends AbstractFunction {
@Override
public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2) {
Number left = FunctionUtils.getNumberValue(arg1, env);
Number right = FunctionUtils.getNumberValue(arg2, env);
return new AviatorDouble(left.doubleValue() + right.doubleValue());
}
@Override
public String getName() {
return "add";
}
}
Reference
- https://my.oschina.net/kings0/blog/4710642
- https://github.com/killme2008/aviatorscript