花满天的季节
盼望着,盼望着,三月悄然来了。
一切都像刚睡醒的样子,犹如婴儿缓缓睁眼。
粉粉嫩嫩的花儿开始羞涩起来,
沉闷程序猿小哥哥开始躁动起来
小E也带着小妹妹悠悠公园深处。
万物生长
桃花运来了
闷闷直男小E,带着小妹妹压着公园马路看着桃花内心小小的烂漫,话虽不多不爱自拍,但小妹妹在不爱自拍也融于这美美桃花之中,尽可能的绣着恩爱。
甜蜜中
突如其来
我的美梦就这样破碎了
ヽ`、 、ヽ`、还没到三伏天的大雨ヽ`、ヽ、ヽ`ヽヽ、
ヽ`、ヽ ヽ烦人逗比经理电话来了 、 ヽ`、ヽ、ヽ`、ヽ、ヽ`、
ヽ、ヽ 、ヽ`、ヽ、ヽ`、ヽ
Fel是轻量级的高效的表达式计算引擎
Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求。
Fel是开放的,引擎执行中的多个模块都可以扩展或替换。Fel的执行主要是通过函数实现,运算符(+、-等都是Fel函数),所有这些函数都是可以替换的,扩展函数也非常简单。
Fel有双引擎,同时支持解释执行和编译执行。可以根据性能要求选择执行方式。编译执行就是将表达式编译成字节码(生成java代码和编译模块都是可以扩展和替换的)
Fel基于Java1.5开发,适用于Java1.5及以上版本。
Fel有多快?
通常情况下,Fel-0.7每秒可以执行千万次表达式(不包含编译时间)。速度是Jexl-2.0的20倍以上。
目前还没有发现开源的表达式引擎比Fel快。
为何要使用Fel ?
- Fel语法和API非常简单,语法与Java基本相同,几乎没有学习成本。
- Fel非常快,上面已经做了简单说明。
- Fel整个包只有200多KB。
- Fel可以非常方便的访问数组、集合、Map的元素和对象的属性。
- Fel可以非常方便的调用对象的方法和类方法(如果这些还不够,可以添加自定义函数)。
- Fel支持大数值高精度计算
- Fel有良好的安全管理功能
- 如果Fel不能满足你的要求,扩展和修改Fel很简单。
Fel适用场景
- Fel只支持表达式,不支持脚本。
- Fel适合处理海量数据,Fel良好的扩展性可以更好的帮助用户处理数据。
- Fel同样适用于其他需要使用表达式引擎的地方(如果工作流、公式计算、数据有效性校验等等)
如何使用
项目虽然很久很久没有进行更新,但现有BUG甚少。最新版本为0.9,但maven只到0.8😭
- 项目主页:http://code.google.com/p/fast-el
- 下载地址:http://code.google.com/p/fast-el/downloads/list
- Maven
<dependency>
<groupId>org.eweb4j</groupId>
<artifactId>fel</artifactId>
<version>0.8</version>
</dependency>
Fel使用例子
- 算术表达式:
FelEngine fel = new FelEngineImpl();
Object result = fel.eval("5000*12+7500");
System.out.println(result);
输出结果:67500
- 变量 使用变量,其代码如下所示:
FelContext ctx = fel.getContext();
ctx.set("单价", 5000);
ctx.set("数量", 12);
ctx.set("运费", 7500);
Object result = fel.eval("单价*数量+运费");
System.out.println(result);
输出结果:67500
- 访问对象属性:
FelEngine fel = new FelEngineImpl();
FelContext ctx = fel.getContext();
Foo foo = new Foo();
ctx.set("foo", foo);
Map<String,String> m = new HashMap<String,String>();
m.put("ElName", "fel");
ctx.set("m",m);
//调用foo.getSize()方法。
Object result = fel.eval("foo.size");
//调用foo.isSample()方法。
result = fel.eval("foo.sample");
//foo没有name、getName、isName方法
//foo.name会调用foo.get("name")方法
result = fel.eval("foo.name");
//m.ElName会调用m.get("ElName");
result = fel.eval("m.ElName");
- 编译执行:
FelEngine fel = new FelEngineImpl();
FelContext ctx = fel.getContext();
ctx.set("单价", 5000);
ctx.set("数量", 12);
ctx.set("运费", 7500);
Expression exp = fel.compile("单价*数量+运费",ctx);
Object result = exp.eval(ctx);
System.out.println(result);
执行结果:67500
- 访问数组、集合、Map
- 调用JAVA方法
- 自定义上下文环境
- 多层上下文环境(命名空间)
- 自定义函数
- 调用静态方法
- 大数值计算(始于0.9版本)
安全(始于0.8版本)
为了防止出现“${'System'}.exit(1)”这样的表达式导致系统崩溃。Fel加入了安全管理器,主要是对方法访问进行控制。安全管理器中通过允许访问的方法列表(白名单)和禁止访问的方法列表(黑名单)来控制方法访问。将"java.lang.System. *
"加入到黑名单,表示System类的所有方法都不能访问。将"java.lang.Math. *
"加入白名单,表示只能访问Math类中的方法。如果你不喜欢这个安全管理器,可以自己开发一个,非常简单,只需要实现一个方法就可以了。
在此之前小E居然都不知道有这样强力的表达式计算引擎,就这样小E跟着逗比经理引导学习了一波强力的Fel。
小E正在着手对项目指标算费改造方案规划中……
有兴趣想知晓后续的同学可以留言并分享哦
----------------------------------- END -----------------------------------
盼望着 盼望着
小E的女朋友更近了
最近小E正在学习小程序相关的知识并开发了自己的小程序,有兴趣的同学可以加小E的VX并备注“小程序”,小E的VX: Egzasn
也可以关注小E的公众号: 墨鲸说话