阅读更多

 

    Aviator是一个轻量级的、高性能的Java表达式求值器,主要应用在工作流引擎节点条件判断、MQ中的消息过滤以及某些特定的业务场景中。

 

   Aviator的设计思路跟利用GroovyObject的求值思路是一样的,通过编译并动态生成字节码的方式将表达式编译成一个类,然后反射执行这个类,因此会在效率上比纯解释执行的IKExpression好一些。

 

      自从上次发布1.0后,还发过1.01版本,不过都没怎么宣传。这次发布一个2.0的里程碑版本,主要改进如下:

 

1、完整支持位运算符,与java完全一致。 

2、优化了性能,平均性能提升100%,函数调用性能提升200%,最新的groovy和JEXL的性能测试看这里 http://code.google.com/p/aviator/wiki/Performance 

3、添加了新函数,包括long、double、str等用于类型转换的函数,添加了string.indexOf函数。 

4、完善了用户手册,更新了性能测试。

 

下载地址:  http://code.google.com/p/aviator/downloads/list

项目主页:  http://code.google.com/p/aviator/

用户指南:  http://code.google.com/p/aviator/w/list

性能报告:  http://code.google.com/p/aviator/wiki/Performance

源码:        https://github.com/killme2008/aviator

 

 

maven引用:

	<dependency>
			<groupId>com.googlecode.aviator</groupId>
			<artifactId>aviator</artifactId>
                        <version>2.0</version>
	</dependency>

 

6
0
评论 共 25 条 请登录后发表评论
25 楼 ray_linn 2011-07-19 15:05
dennis_zane 写道
好吧,我再耐心点。
1/3无论在java还是aviator里的结果都是0,因为两个都是整数,整除为0。你要想结果提升为double,就需要至少一个操作数是double。你可以1.0/3,可以1/3.0,也可以1.0/3.0。
java的运算规则是,double与long或者int运算,结果提升为double,aviator的规则完全相同。


遇到这么个不谦虚的小白~认了吧。反正ITEYE上就是小白多
24 楼 dennis_zane 2011-07-19 14:41
关于类型提升和窄化的规则可以看这个
http://java.sun.com/docs/books/jls/third_edition/html/conversions.html

只要google一下就可以知道的东西,为什么需要别人来告诉你?
23 楼 dennis_zane 2011-07-19 14:38
好吧,我再耐心点。
1/3无论在java还是aviator里的结果都是0,因为两个都是整数,整除为0。你要想结果提升为double,就需要至少一个操作数是double。你可以1.0/3,可以1/3.0,也可以1.0/3.0。
java的运算规则是,double与long或者int运算,结果提升为double,aviator的规则完全相同。
22 楼 dennis_zane 2011-07-19 14:36
如果自己不懂,可以谦虚点,至少尝试跑下代码再下结论。我很讨厌这种纯粹为了反对而反对的论调。
21 楼 dennis_zane 2011-07-19 14:35
还需要我说多少遍吗?你将你那个表达式放到java里执行看看,我无语了。
20 楼 windywany 2011-07-19 14:34
ray_linn 写道
windywany 写道
ray_linn 写道
windywany 写道
dennis_zane 写道
windywany 写道
Double result = (Double) AviatorEvaluator.execute("1.0 + 2 + 3 + 1/3"); 这个结果让我太意外了.


这个表达式就算在java里也是6.0,所以我搞不清楚你的意外在哪里,而是你这个回复太让我意外了。

就意外在result只能是Double不能是Long! 是Double的话,你们认为结果是6.0还是对的吗?



怎么算也是最后才转为double,还是6.0

那如何才能让这个表达式的结果是6.33呢?


1.0/3.0
dennis_zane 写道
windywany 写道
ray_linn 写道
windywany 写道
dennis_zane 写道
windywany 写道
Double result = (Double) AviatorEvaluator.execute("1.0 + 2 + 3 + 1/3"); 这个结果让我太意外了.


这个表达式就算在java里也是6.0,所以我搞不清楚你的意外在哪里,而是你这个回复太让我意外了。

就意外在result只能是Double不能是Long! 是Double的话,你们认为结果是6.0还是对的吗?



怎么算也是最后才转为double,还是6.0

那如何才能让这个表达式的结果是6.33呢?


你要6.3,就要这样 1+2+3+1.0/3
我建议你再好好看java的类型转换规则和运算规则

为使用这个轻量级的、高性能的Java表达式求值器的程序员们平添了许多愁--至少他们要将用户理解的1/3转换为Aviator理解的1.0/3.0。
19 楼 ray_linn 2011-07-19 14:05
windywany 写道
ray_linn 写道
windywany 写道
dennis_zane 写道
windywany 写道
Double result = (Double) AviatorEvaluator.execute("1.0 + 2 + 3 + 1/3"); 这个结果让我太意外了.


这个表达式就算在java里也是6.0,所以我搞不清楚你的意外在哪里,而是你这个回复太让我意外了。

就意外在result只能是Double不能是Long! 是Double的话,你们认为结果是6.0还是对的吗?



怎么算也是最后才转为double,还是6.0

那如何才能让这个表达式的结果是6.33呢?


1.0/3.0
18 楼 dennis_zane 2011-07-19 14:02
windywany 写道
ray_linn 写道
windywany 写道
dennis_zane 写道
windywany 写道
Double result = (Double) AviatorEvaluator.execute("1.0 + 2 + 3 + 1/3"); 这个结果让我太意外了.


这个表达式就算在java里也是6.0,所以我搞不清楚你的意外在哪里,而是你这个回复太让我意外了。

就意外在result只能是Double不能是Long! 是Double的话,你们认为结果是6.0还是对的吗?



怎么算也是最后才转为double,还是6.0

那如何才能让这个表达式的结果是6.33呢?


你要6.3,就要这样 1+2+3+1.0/3
我建议你再好好看java的类型转换规则和运算规则
17 楼 windywany 2011-07-19 13:38
ray_linn 写道
windywany 写道
dennis_zane 写道
windywany 写道
Double result = (Double) AviatorEvaluator.execute("1.0 + 2 + 3 + 1/3"); 这个结果让我太意外了.


这个表达式就算在java里也是6.0,所以我搞不清楚你的意外在哪里,而是你这个回复太让我意外了。

就意外在result只能是Double不能是Long! 是Double的话,你们认为结果是6.0还是对的吗?



怎么算也是最后才转为double,还是6.0

那如何才能让这个表达式的结果是6.33呢?
16 楼 ray_linn 2011-07-19 13:29
windywany 写道
dennis_zane 写道
windywany 写道
Double result = (Double) AviatorEvaluator.execute("1.0 + 2 + 3 + 1/3"); 这个结果让我太意外了.


这个表达式就算在java里也是6.0,所以我搞不清楚你的意外在哪里,而是你这个回复太让我意外了。

就意外在result只能是Double不能是Long! 是Double的话,你们认为结果是6.0还是对的吗?



怎么算也是最后才转为double,还是6.0
15 楼 windywany 2011-07-19 12:37
dennis_zane 写道
windywany 写道
Double result = (Double) AviatorEvaluator.execute("1.0 + 2 + 3 + 1/3"); 这个结果让我太意外了.


这个表达式就算在java里也是6.0,所以我搞不清楚你的意外在哪里,而是你这个回复太让我意外了。

就意外在result只能是Double不能是Long! 是Double的话,你们认为结果是6.0还是对的吗?
14 楼 ray_linn 2011-07-18 14:27
windywany 写道
Double result = (Double) AviatorEvaluator.execute("1.0 + 2 + 3 + 1/3"); 这个结果让我太意外了.


答案是6.0,必然的,1/3在java int中等于0.
13 楼 chimer 2011-07-15 22:16
1/3 得到的是强转 int ,为0 不是只有java这么干的。
12 楼 dennis_zane 2011-07-15 17:26
windywany 写道
Double result = (Double) AviatorEvaluator.execute("1.0 + 2 + 3 + 1/3"); 这个结果让我太意外了.


这个表达式就算在java里也是6.0,所以我搞不清楚你的意外在哪里,而是你这个回复太让我意外了。
11 楼 dennis_zane 2011-07-15 17:25
windywany 写道
Double result = (Double) AviatorEvaluator.execute("1.0 + 2 + 3 + 1/3"); 这个结果让我太意外了.


6.0

这个结果怎么意外了??
10 楼 windywany 2011-07-15 17:12
Double result = (Double) AviatorEvaluator.execute("1.0 + 2 + 3 + 1/3"); 这个结果让我太意外了.
9 楼 elan1986 2011-07-15 12:19
mark!
8 楼 maodiesky 2011-07-15 08:38
MARK一下
7 楼 calvinlyc 2011-07-14 19:04
这个其实应该就是类似于.Net中LINQ的东西吧,其实Java一直缺一个这样的工具
6 楼 kjj 2011-07-14 18:05
一直还是beanshell 和bsf

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • C++中 DWORD和int的区别

    INT 代表int, DWORD 代表 unsigned long int会随着机器位数的不同而发生变化,比如在16位机上为16为,在32位机上为32位,在64位机上为64位。看看最原始的定义就知道了。 DWORD是无符号的,相当于unsigned long ,它是MFC的数据类型。 而int是有符号性的,而且他所占的字节数不一定是4个,主要和你的 IDE有关,像在Turbo C中就是2个字节,VC6.0中就是4个字节 切忌把 int 看成 32 位 书中早就说了 long 32位有符号整数 int

  • C++ WORD&&DWORD类型转int

    【代码】C++ WORD&&DWORD类型转int。

  • 刘铁猛挨踢人感言:做一个高情商的程序员

    一个在光怪陆离混迹的群体,他们自称程序猿、攻城狮、挨踢民工,一面乐观的自嘲,一面努力的工作。提起他们,你也许想到了张江男,想到了眼睛、T恤、牛仔裤、运动鞋、双肩包,但是有些故事是你眼睛所看不到的。在这里,我们一起来倾听一个IT人生的故事,技术路上不孤单! 姓名:刘铁猛 Tim 性别:男 生日:70后 所在城市:Redmond(雷德蒙德,美国华盛顿州城市,微软总部) 关键词:《深入浅出WPF》 职业信息: 从业时间:2002 行业:软件 职位:软件工程师 关注技术:架构与模式 小序: 很高兴..

  • 猿创征文|一位.Net开发工程师的客户端技术栈的学习路线

    从2018年硕士毕业后,我一直从事着.Net开发工作,趁着CSDN这次活动,给大家分享一下DotNet客户端领域的技术栈的学习路线,这个学习路线,涵盖的是比较基础的内容,适合刚入门.Net的萌新学习和刚进入职场的毕业生查漏补缺,然后这个博文比较受大家的欢迎的话,后续可能会考虑出一个更详细的版本。致敬我彻夜学习的.Net。

  • 串口通讯——由入门到放弃(window下)

    一、基本知识 刚开始接到任务说是要写一个基于RS422串口通讯的协议和接口,我靠这我哪会!!!????‍♂️ 于是刚开始一通乱找 什么是RS422? 啥叫协议? 协议跟485是有很大关系吗?作为小白的我经过挠头三连击后,又请教了教研室的大佬,下面我们来详细了解一下! 1 串口通讯 串口通讯(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯...

  • Windows串口通信

    串口通信的基本步骤: 通过CreateFile("com3") 打开串口 通过DCB结构体和SetCommState函数,设置串口的参数 通过ReadFile()和WriteFile()读写串口 Windows串口通信实例 封装了一个串口通信的C++类CSerial,通过CSerial类的OpenSerialPort()可以打开一个串口,串口打开后后自动新建线程读取串口...

  • 【C#进阶学习】——刘铁猛老师

    一、 C#语言入门详解:类、对象、类成员简介 1.1实例化对象 1.2引用变量(可以对同一个对象进行操作和访问) 1.3类 以属性为侧重点的类 以方法为侧重点的类 以属性为侧重点的类 1.4.静态成员与实例化成员 静态成员:立属于类的,表现出来这个类的各项特征和行为状态, 比如人类的总数,增长率(对这个类来说是有意义的)。 实例成员:立属于这个实例化出来的对象的各种特征和行为状态, 比如人的身高,体重,唱歌和跳舞(对这个类来说是没有意义

  • VC 常用数据类型总结

    导读: vc类型本文转自 http://www.cnblogs.com/sadier/articles/102085.html VC 常用数据类型总结 ATOM 原子(原子表中的一个字符串的参考) BOOL 布尔变量 BOOLEAN 布尔变量 BYTE 字节(8位) CCHAR Windows字符 CHAR Windows字符 COLORREF 红、绿、蓝(RGB)彩色值(32位) Con

  • 社区英雄榜:谁是最有价值的技术博客?

    MVB评选开始了,欢迎大家给你心目中最有价值的博客投票...投票地址:http://www.csdn.net/community2006/vote/index.rails?id=1整理CSDN 最有价值博客的提名真是一件头痛的事情,要从17万博客注册用户中挑选出50名对网友最有价值的博客来不是一件简单的事情,因为:第一、CSDN Blog不像BBS有专家分和各版面排名这种量化的指标,我们有的只有访

  • 【串口收发数据】热成像模组使用

    最近搞了一个热成像模组,收发数据用来检测体温,找了一下串口收发数据的应用,利用VS2019写的C++代码,尝试成功,记录下来,以备不时之需。 代码如下: 1、cap_tem.h文件 #ifndef _WZSERIALPORT_H #define _WZSERIALPORT_H #include&lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; using namespace std; class WZSerialPo

  • c语言入门详解刘铁猛,《C#入门详解》刘铁猛 初识类与名称空间&类,对象,类成员简介...

    初识类与名称空间一、如果我们写一个类,没有把这个类的名称空间是哪个标出来的时候,就从引用的名称空间里检索,看到哪个名称空间里有这个类;1.Using把名称空间引用进来;2.一个solution里可以有多个项目(Project);3.名称空间就是以树形结构组织类;4.我们编写了一个类“program”放在“namespace helloworld”这个名称空间里,意思是我自己写了一个类,当别人调用我...

  • 关于INT_PTR的理解

    使用CStringArray 定义数组获并取数组大小,语句如下:    CStringArray sArr;    sArr.Add("姓名");    sArr.Add("姓名");    int nCount = sArr.GetCount(); 使用VS2003编译时,得到如下警告信息: warning C4244: “=” : 从“INT_PTR”转换到“int”,可能丢失数据

  • Windows数据类型探幽——千回百转你是谁?(1)

    Windows Data TypesWindows数据类型   由微软Windows操作系统所支持的各种数据类型是用来定义函数的返回值、函数和消息的参数以及结构体成员(因为Win32程序是用C语言来编写,所以没有“类”这个概念)的。这些数据类型定义了上述元素的尺码(在内存中的,也就是占用内存的字节数)和含义。笔者以前一直不太注意这些东西,结果在程序设计时可谓步履维艰。不同类型的常/变量,在程序用扮

  • FFmpeg解码H264为YUV420

    在这里我们主要用到三个函数实现解码过程,首先是H264解码初期化,其次是进行H264解码,最后 H264解码销毁 H264Decoder.h #pragma once extern "C"{ #include #include #include } #define X264_DECODER_H long typedef struct { struct AVCodec

  • VC的类型推导问题

    由于代码要兼容64位系统,所以,跟指针有关联的整数全部都是适用的INT_PTR和UINT_PTR类型。这两个东西在32位系统下被定义成:__w64 int和__w64 unsigned int. 但是,VC的模板参数推导机制里,似乎是没有__w64这样的修饰的,因此,所有的__w64 int被推导成类型int,实例化出int类型的模板。在参数传递的时候,由于传递的参数是__w64 int类型,就会

  • Windows系统:解析文件句柄Handle的详细机制

    1. 用户程序和运行库层面的文件”句柄” FILE*IO初始化时讨论了在运行库层面的文件句柄管理机制,工作流程如下FILE *file ->ininfo* pioinfo\[\]\[\] -> ioinfo 1.在程序中提供给IO函数的文件句柄是封装在FILE*指针里面的; 2.FILE结构体总共包括两方面内容:a.该文件配备的缓冲大小、地址等信息;b.该文件在进程打开文件列表中的下标_file;

  • 解开一个困扰自己多时的小问题——从std::cout和endl说起

    解开一个困扰自己多时的小问题小序今天上班的时候问了一起工作的Sidney同学一个小问题,显然他是研究过了的,不过他当时没有给出我答案。这个问题着实困扰了我好长时间捏~~         晚上吃的小葱蘸酱,呵呵,吃完之后气儿顺了、脑子也清醒了许多,想起这个问题没搞定,于是顺着Sidney同学提供的线索把问题搞明白了。 正文         问题是这样的……相信下面这个程序

  • C++主题年技巧积累#1——UltraEdit的代码美化

    C++主题年技巧积累#1——UltraEdit的代码美化CSDN旗下水之真谛(http://blog.csdn.net/FantasiaX)出品小序:         最近这些天总有朋友问我怎么不写C#的东西了,呵呵,是这样的——今年的年度计划中我把“年度技术主题”定为了C++语言,所以学习的内容就偏重C++了——显然,去年的主题是C#。当然啦,温故可以知新,所以我也会时常对照着C++

Global site tag (gtag.js) - Google Analytics