史上最为高效的表达式计算引擎Fel

原创
2021/03/01 12:44
阅读数 91

花满天的季节

盼望着,盼望着,三月悄然来了。

一切都像刚睡醒的样子,犹如婴儿缓缓睁眼。

粉粉嫩嫩的花儿开始羞涩起来,

沉闷程序猿小哥哥开始躁动起来

小E也带着小妹妹悠悠公园深处。

图片.png

万物生长

图片.png桃花运来了

   闷闷直男小E,带着小妹妹压着公园马路看着桃花内心小小的烂漫,话虽不多不爱自拍,但小妹妹在不爱自拍也融于这美美桃花之中,尽可能的绣着恩爱。

甜蜜中

突如其来

 

我的美梦就这样破碎了

 

 

 

ヽ`、 、ヽ`、还没到三伏天的大雨ヽ`、ヽ、ヽ`ヽヽ、

ヽ`、ヽ ヽ烦人逗比经理电话来了 、 ヽ`、ヽ、ヽ`、ヽ、ヽ`、

ヽ、ヽ 、ヽ`、ヽ、ヽ`、ヽ

Fel是轻量级的高效的表达式计算引擎

 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求。

    Fel是开放的,引擎执行中的多个模块都可以扩展或替换。Fel的执行主要是通过函数实现,运算符(+、-等都是Fel函数),所有这些函数都是可以替换的,扩展函数也非常简单。

    Fel有双引擎,同时支持解释执行和编译执行。可以根据性能要求选择执行方式。编译执行就是将表达式编译成字节码(生成java代码和编译模块都是可以扩展和替换的)

Fel基于Java1.5开发,适用于Java1.5及以上版本。

Fel有多快? 

    通常情况下,Fel-0.7每秒可以执行千万次表达式(不包含编译时间)。速度是Jexl-2.0的20倍以上。
    目前还没有发现开源的表达式引擎比Fel快。

为何要使用Fel ?

  1. Fel语法和API非常简单,语法与Java基本相同,几乎没有学习成本。
  2. Fel非常快,上面已经做了简单说明。
  3. Fel整个包只有200多KB。
  4. Fel可以非常方便的访问数组、集合、Map的元素和对象的属性。
  5. Fel可以非常方便的调用对象的方法和类方法(如果这些还不够,可以添加自定义函数)。
  6. Fel支持大数值高精度计算
  7. Fel有良好的安全管理功能
  8. 如果Fel不能满足你的要求,扩展和修改Fel很简单。

Fel适用场景

  1. Fel只支持表达式,不支持脚本。
  2. Fel适合处理海量数据,Fel良好的扩展性可以更好的帮助用户处理数据。
  3. Fel同样适用于其他需要使用表达式引擎的地方(如果工作流、公式计算、数据有效性校验等等)

如何使用

  项目虽然很久很久没有进行更新,但现有BUG甚少。最新版本为0.9,但maven只到0.8😭

 

  1. 项目主页:http://code.google.com/p/fast-el
  2. 下载地址:http://code.google.com/p/fast-el/downloads/list
  3. 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的公众号: 墨鲸说话

 

 

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部