Aviator-2.3.0用户指南.pdf
《Aviator-2.3.0用户指南.pdf》由会员分享,可在线阅读,更多相关《Aviator-2.3.0用户指南.pdf(24页珍藏版)》请在沃文网上搜索。
1、 Aviator 2.3.0 用户指南 使用手册 Phase-Support,Featured 版本变更 简介 特性 整体结构 依赖包 maven 依赖 使用手册 o 执行表达式 o 使用变量 exec 方法 o 调用函数 自定义函数 o 编译表达式 o 访问数组和集合 o 三元操作符 o 正则表达式匹配 o 变量的语法糖衣 o nil 对象 o 日期比较 o 大数计算和精度 字面量表示 运算 类型转换和提升 decimal 的计算精度 o 强大的 seq 库 o 两种运行模式 o 调试信息 o 语法手册 数据类型 操作符 算术运算符 逻辑运算符 关系运算符 位运算符 匹配运算符 三元运算符
2、操作符列表 类型转换规则 常量和变量 内置函数 版本变更版本变更 2013-05-18 完成 0.6 版本,添加大数和精度计算小节,适配 aviator 2.3.0 2010-06-28 完成 0.1 版本 2010-09-07 修改完成 0.2 版本 2011-07-13 完成 0.3 版本,适配 aviator 2.0 2011-09-18 完成 04.版本,适配 aviator 2.1.1 2011-12-27 完成 0.5 版本,适配 aviator 2.2.1 简介简介 Aviator 是一个高性能、轻量级的 java 语言实现的表达式求值引擎,主要用于各种表达式的动态求值。现在已经
3、有很多开源可用的 java 表达式求值引擎,为什么还需要 Avaitor 呢?Aviator 的设计目标是轻量级轻量级和高性能高性能,相比于 Groovy、JRuby 的笨重,Aviator 非常小,加上依赖包也才 450K,不算依赖包的话只有 70K;当然,Aviator 的语法是受限的,它不是一门完整的语言,而只是语言的一小部分集合。其次,Aviator 的实现思路与其他轻量级的求值器很不相同,其他求值器一般都是通过解释的方式运行,而 Aviator 则是直接将表达式编译成编译成 Java 字节码字节码,交给 JVM 去执行。简单来说,Aviator 的定位是介于 Groovy 这样的重量
4、级脚本语言和 IKExpression 这样的轻量级表达式引擎之间。特性特性 Aviator 的特性 支持大部分运算操作符,包括算术操作符、关系运算符、逻辑操作符、位运算符、正则匹配操作符(=)、三元表达式?:,并且支持操作符的优先级和括号强制优先级,具体请看后面的操作符列表。支持函数调用和自定义函数 内置支持正则表达式匹配,类似 Ruby、Perl 的匹配语法,并且支持类 Ruby 的$digit指向匹配分组。自动类型转换,当执行操作的时候,会自动判断操作数类型并做相应转换,无法转换即抛异常。支持传入变量,支持类似 a.b.c 的嵌套变量访问。函数式风格的 seq 库,操作集合和数组 性能优
5、秀 Aviator 的限制:没有 if else、do while 等语句,没有赋值语句,仅支持逻辑表达式、算术表达式、三元表达式和正则匹配。不支持八进制数字字面量,仅支持十进制和十六进制数字字面量。整体结构整体结构 Aviator 的结构非常简单,一个典型的求值器的结构 依赖包依赖包 commons-beanutils 和 commons-logging maven 依赖依赖 使用 maven 添加下列依赖即可:com.googlecode.aviator aviator 2.3.0 使用手册使用手册 执行表达式执行表达式 Aviator 的使用都是集中通过 com.googlecode.a
6、viator.AviatorEvaluator 这个入口类来处理,最简单的例子,执行一个计算 1+2+3 的表达式:import com.googlecode.aviator.AviatorEvaluator;public class SimpleExample public static void main(String args)Long result=(Long)AviatorEvaluator.execute(1+2+3);System.out.println(result);细心的朋友肯定注意到结果是 Long,而不是 Integer。这是因为 Aviator 的数值类型仅支持Lon
7、g 和 Double,任何整数都将转换成 Long,任何浮点数都将转换为 Double,包括用户传入的变量数值。这个例子的打印结果将是正确答案 6。使用变量使用变量 想让 Aviator 对你 say hello 吗?很简单,传入你的名字,让 Aviator 负责字符串的相加:import com.googlecode.aviator.AviatorEvaluator;public class SayHello public static void main(String args)if(args.length 1)System.err.print(Usesage:Java SayHello
8、yourname);String yourname=args0;Map env=new HashMap();env.put(yourname,yourname);String result=(String)AviatorEvaluator.execute(hello +yourname,env);System.out.println(result);上面的例子演示了怎么向表达式传入变量值,表达式中的 yourname 是一个变量,默认为null,通过传入 Map的变量绑定环境,将 yourname 设置为你输入的名称。env的 key 是变量名,value 是变量的值。上面例子中的hello
9、是一个 Aviator 的 String,Aviator 的 String 是任何用单引号或者双引号括起来的字符序列,String 可以比较大小(基于 unicode 顺序),可以参与正则匹配,可以与任何对象相加,任何对象与 String 相加结果为 String。String 中也可以有转义字符,如n、等。AviatorEvaluator.execute(ab);/字符串 ab AviatorEvaluator.execute(ab);/字符串 ab AviatorEvaluator.execute(hello+3);/字符串 hello 3 AviatorEvaluator.execute
10、(hello+unknow);/字符串 hello null exec 方法方法 Aviator 2.2 开始新增加一个 exec 方法,可以更方便地传入变量并执行,而不需要构造 env 这个 map 了:String myname=dennis;AviatorEvaluator.exec(hello +yourname,myname);只要在 exec 中按照变量在表达式中的出现顺序传入变量值就可以执行,不需要构建 Map 了。调用函数调用函数 Aviator 支持函数调用,函数调用的风格类似 lua,下面的例子获取字符串的长度:AviatorEvaluator.execute(string
11、.length(hello);string.length(hello)是一个函数调用,string.length 是一个函数,hello是调用的参数。再用 string.substring 来截取字符串:AviatorEvaluator.execute(string.contains(test,string.substring(hello,1,2);通过 string.substring(hello,1,2)获取字符串e,然后通过函数 string.contains 判断 e 是否在test中。可以看到,函数可以嵌套调用。Aviator 的内置函数列表请看后面。自定义函数自定义函数 Aviat
12、or 除了内置的函数之外,还允许用户自定义函数,只要实现com.googlecode.aviator.runtime.type.AviatorFunction 接口,并注册到 AviatorEvaluator 即可使用 AviatorFunction 接口十分庞大,通常来说你并不需要实现所有的方法,只要根据你的方法的参数个数,继承 AbstractFunction 类并 override 相应方法即可。可以看一个例子,我们实现一个 add 函数来做数值的相加:import com.googlecode.aviator.AviatorEvaluator;import com.googlecode
13、.aviator.runtime.function.AbstractFunction;import com.googlecode.aviator.runtime.function.FunctionUtils;import com.googlecode.aviator.runtime.type.AviatorDouble;import com.googlecode.aviator.runtime.type.AviatorObject;public class AddFunction extends AbstractFunction Override public AviatorObject ca
14、ll(Map env,AviatorObject arg1,AviatorObject arg2)Number left=FunctionUtils.getNumberValue(arg1,env);Number right=FunctionUtils.getNumberValue(arg2,env);return new AviatorDouble(left.doubleValue()+right.doubleValue();public String getName()return add;注册到 AviatorEvaluator 并调用如下:/注册函数 AviatorEvaluator.
15、addFunction(new AddFunction();System.out.println(AviatorEvaluator.execute(add(1,2);System.out.println(AviatorEvaluator.execute(add(add(1,2),100);注册函数通过 AviatorEvaluator.addFunction 方法,移除可以通过 removeFunction。编译表达式编译表达式 上面提到的例子都是直接执行表达式,事实上 Aviator 背后都帮你做了编译并执行的工作。你可以自己先编译表达式,返回一个编译的结果,然后传入不同的 env 来复用编
16、译结果,提高性能,这是更推荐的使用方式:import java.util.HashMap;import java.util.Map;import com.googlecode.aviator.AviatorEvaluator;import com.googlecode.aviator.Expression;public class CompileExample public static void main(String args)String expression=a-(b-c)100;/编译表达式 Expression compiledExp=AviatorEpile(expression
17、);Map env=new HashMap();env.put(a,100.3);env.put(b,45);env.put(c,-199.100);/执行表达式 Boolean result=(Boolean)compiledExp.execute(env);System.out.println(result);通过 compile 方法可以将表达式编译成 Expression 的中间对象,当要执行表达式的时候传入env 并调用 Expression 的 execute 方法即可。表达式中使用了括号来强制优先级,这个例子还使用了用于比较数值大小,比较运算符!=、=、=、=不仅可以用于数值,也
18、可以用于 String、Pattern、Boolean 等等,甚至是任何用户传入的两个都实现了 java.lang。Comparable 接口的对象之间。编译后的结果你可以自己缓存,也可以交给 Aviator 帮你缓存,AviatorEvaluator 内部有一个全局的缓存池,如果你决定缓存编译结果,可以通过:public static Expression compile(String expression,boolean cached)将 cached 设置为 true 即可,那么下次编译同一个表达式的时候将直接返回上一次编译的结果。使缓存失效通过:public static void i
19、nvalidateCache(String expression)方法。访问数组和集合访问数组和集合 可以通过中括号去访问数组和 java.util.List 对象,可以通过 map.key 访问 java.util.Map 中 key对应的 value,一个例子:import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import com.googlecode.aviator.AviatorEvaluator;pub
20、lic class CollectionExample public static void main(String args)final List list=new ArrayList();list.add(hello);list.add(world);final int array=new int3;array0=0;array1=1;array2=3;final Map map=new HashMap();map.put(date,new Date();Map env=new HashMap();env.put(list,list);env.put(array,array);env.pu
21、t(mmap,map);System.out.println(AviatorEvaluator.execute(list0+list1+narray0+array1+array2=+(array0+array1+array2)+ntoday is+mmap.date,env);Aviator 同样支持对多维数组的访问(从 2.2 版本开始):int a=.AviatorEvaluator.exec(a01+a00,a);三元操作符三元操作符 Aviator 不提供 if else 语句,但是提供了三元操作符?:用于条件判断,使用上与 java 没有什么不同:import java.util.H
22、ashMap;import java.util.Map;import com.googlecode.aviator.AviatorEvaluator;public class TernaryOperatorExample public static void main(String args)if(args.length 1)System.err.println(Usage:java TernaryOperatorExample number);System.exit(1);int num=Integer.parseInt(args0);Map env=new HashMap();env.pu
23、t(a,num);String result=(String)AviatorEvaluator.execute(a0?yes:no,env);System.out.println(result);这个例子用来判断用户传入的数字是否是正整数,是的话打印 yes。Aviator 的三元表达式对于两个分支的结果类型并不要求一致,可以是任何类型,这一点与 java不同。正则表达式匹配正则表达式匹配 Aviator 支持类 Ruby 和 Perl 风格的表达式匹配运算,通过=操作符,如下面这个例子匹配email 并提取用户名返回:import java.util.HashMap;import java.
24、util.Map;import com.googlecode.aviator.AviatorEvaluator;public class RegularExpressionExample public static void main(String args)String email=;Map env=new HashMap();env.put(email,email);String username=(String)AviatorEvaluator.execute(email=/(w0-8+)w+.w+/?$1:unknow,env);System.out.println(username)
25、;email 与正则表达式/(w0-8+w+.w+)/通过=操作符来匹配,结果为一个 Boolean 类型,因此可以用于三元表达式判断,匹配成功的时候返回$1,指代正则表达式的分组 1,也就是用户名,否则返回 unknown。这个例子将打印 killme2008 这个用户名。Aviator 在表达式级别支持正则表达式,通过/括起来的字符序列构成一个正则表达式,正则表达式可以用于匹配(作为=的右操作数)、比较大小,匹配仅能与字符串进行匹配。匹配成功后,Aviator 会自动将匹配成功的分组放入$num 的变量中,其中$0 指代整个匹配的字符串,而$1 表示第一个分组,以此类推。Aviator 的
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Aviator 2.3 用户指南
