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

article/2025/9/13 21:04:01

花满天的季节

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

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

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

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

小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

也可以GZ小E的vxGZH: 墨鲸说话


http://chatgpt.dhexx.cn/article/u7Zbssnm.shtml

相关文章

fel的简单使用及介绍

Fel介绍 Fel在源自于企业项目&#xff0c;设计目标是为了满足不断变化的功能需求和性能需求。 Fel是开放的&#xff0c;引擎执行中的多个模块都可以扩展或替换。Fel的执行主要是通过函数实现,运算符(、-等都是Fel函数&#xff09;&#xff0c;所有这些函数都是可以替换的&#…

Fel实现自定义计算引擎,平均计算速度每秒10w

Fel的介绍和简单使用以及0.9版本的包在之前的博客写过了&#xff0c;有需要的朋友移步&#xff1a;fel的简单使用及介绍 项目地址&#xff1a;https://github.com/an-yusheng/CSDN-FelDemo 1. 基础的应用 下面的代码是引用原生类进行执行的&#xff0c;支持通用数学函数即加减…

访问SMBus设备

使用SMBus访问温度传感器&#xff0c;并控制smart Fan 首先聊聊SMBus的访问方法 硬件上&#xff1a;两条线SMBus Clock和Data信号 当clock信号为高时data信号才有效&#xff0c;data信号下降&#xff0c;意味着Start。data信号上升&#xff0c;意味着Stop。开始后会发送九位&…

SMBUS通信波形分析

SMbus通信协议 1.特性 SMBus是 System Management Bus 的缩写&#xff0c;译为系统管理总线&#xff0c;SMBus是一种二线制串行总线&#xff0c;1996年第一版规范开始商用。它大部分基于I2C总 线规范。和 I2C一样&#xff0c;SMBus不需增加额外引脚&#xff0c;创建该总线主要…

DSP SMBus总线通信

参考文档&#xff1a;System Management Bus (SMBus) Specification Version 3.0.pdf 简介&#xff1a; SMBus&#xff08;System Management Bus&#xff09;于1995年被 Intel 提出&#xff0c;应用于低速率通信&#xff0c;是一种二线制串行总线&#xff0c;该总线大部分基…

linux i2c smbus驱动

目录 目录 数据收发流程 驱动层 收发接口 驱动层注册 smbus控制器 i2c控制器 协议接口使用 总体流程 数据收发关键数据结构 使用示例--eeprom的读写 使用示例--smbus的读写接口 数据收发流程 驱动层 收发接口 首先了解&#xff0c;驱动层向协议&#xff08;算法&a…

初学 SMBus

(这篇主要对象为固件工程师&#xff0c;简单介绍SMBus的一些基本概念而已) 概述 System Management Bus (简称SMBus或是SMB) &#xff0c;是1995年由Intel提出的&#xff0c;用来访问主机板上的设备(EEPROM、温度感测器、电压感测器等) 并收集相应的资讯(SPD、温度、电压、版…

SMBus协议

SMBus协议 文章目录 SMBus协议参考资料&#xff1a;一、 SMBus是I2C协议的一个子集二、 SMBus协议分析2.1 symbols(符号)2.2 SMBus Quick Command2.3 SMBus Receive Byte2.4 SMBus Send Byte2.5 SMBus Read Byte2.6 SMBus Read Word2.7 SMBus Write Byte2.8 SMBus Write Word2.…

系统管理总线(SMBus)介绍

SMBus介绍 系统管理总线协议概要系统管理总线 关键标记表SMBus接口函数1. SMBus Quick Command2. SMBus接收字节函数&#xff1a;i2c_smbus_read_byte()3. SMBus发送字节函数&#xff1a;i2c_smbus_write_byte()4. SMBus读取字节函数&#xff1a;i2c_smbus_read_byte_data()5. …

SMBus学习记录

SMBus学习记录 注&#xff1a;本文基于对于smb3.0 spec的学习总结。更多时序要求需要查阅spec。 SMBus 是 System Management Bus 的缩写&#xff0c;译为系统管理总线&#xff0c;SMBus是一种二线制串行总线&#xff0c;1996年第一版规范开始商用。它大部分基于I2C总线规范。…

SMBus通信,与IIC通信的差异

SMbus总线 SMBus是System Management Bus的缩写&#xff0c;它是一种简单的串行通信总线&#xff0c;用于连接计算机上的系统管理芯片和其他设备&#xff0c;如电池、风扇、温度传感器等。SMBus是由英特尔公司开发的&#xff0c;它基于I2C总线协议&#xff0c;但是增加了一些额…

【Linux】特别篇--SMBus 协议

【Linux】特别篇--SMBus 协议 一、SMBus 简介二、SMBus 与 I2C 区别三、SMBus协议分析3.1 符号含义3.2 SMBus Quick Command3.3 SMBus Receive Byte3.4 SMBus Send Byte3.5 SMBus Read Byte3.6 SMBus Read Word3.7 SMBus Write Byte3.8 SMBus Write Word3.9 SMBus Block Read3.…

SMBUS的介绍与访问

博文是为了总结自己在bios学习上面的点点滴滴&#xff0c;并且加深印象&#xff0c;由于本人水平有限&#xff0c;难免存在不足之处&#xff0c;望指正&#xff0c;同时感谢CSDN提供的平台。本文主要介绍的是SMBUS。 1 SMBUS的简介 特点&#xff1a; SMBUS&#xff0c;System …

java完整开发环境搭建_如何搭建一个完整的Java开发环境

这篇文章主要教大家如何搭建一个完整的Java开发环境&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 作为一个Java程序员&#xff0c;配置一个java开发环境是必备的技能&#xff0c;今天给广大菜鸟初学者补上一课。环境的配置&#xff0c;大概就分三个…

1.1-java开发环境搭建

java开发环境搭建 回到第一章&#xff1a;目录 文章目录 java开发环境搭建前言一、下载jdk1.安装前检查 二、安装jdk1.安装2.配置环境变量3.验证安装 前言 本节内容是搭建java的开发环境。 分为三步&#xff1a;下载jdk&#xff1b;安装jdk&#xff1b;配置环境变量&#xff…

Windows Java开发环境搭建

1.下载安装配置 JDK 8 打开 https://developer.oracle.com/找到 Java8 下载位置&#xff0c;点击下载链接&#xff0c;下载JDK 8 下载后如下图所示&#xff0c;双击安装一直选择选择下一步 2.下载安装 Eclipse点击官网下载 Eclipse下载后就是一个压缩包&#xff0c;只需解压即…

基于Centos7的Java开发环境搭建

基于Centos7的Java服务器搭建 前提&#xff1a;Centos常用命令安装 1. 安装wget yum -y install wget2. 安装gcc yum -y install gcc1. Centos7下的防火墙操作 systemctl status firewalld # 查看防火墙状态 systemctl start firewalld # 开启防火墙 systemctl stop fi…

Java开发环境的搭建与配置

Java开发环境的搭建与配置 1、JDK、JRE、JVM的关系 2、JDK的下载&#xff1a;http://java.sun.com 3、JDK安装&#xff1a;可以自定义安装路径 4、JDK环境变量配置&#xff1a; 鼠标右击【计算机】->【属性】->【高级系统设置】->【高级】->【环境变量】 系统变…

Java开发环境搭建实践

前言 刚刚弄完python的环境搭建&#xff0c;今年打算也要好好学习Java&#xff0c;所以把Java的环境弄起来 搭建过程 jdk下载和安装 下载 官网&#xff1a;Oracle 甲骨文中国 | 云应用和云平台 打开官网 点击产品后下拉找到Java点进去。 下载Java 我就下载最新的jdk把…

程序员福音 【完整的Java开发环境搭建】 系列篇

原文地址 BY Jason 文章目录 原文地址Java开发环境搭建统一问题解决&#xff08;更新中&#xff09;1. vim常用操作命令2. 关于Linux防火墙开放端口问题 环境安装目录&#xff08;更新中&#xff09;Docker安装容器安装SSHJDK安装MySQL安装Redis安装RabbitMQ安装 Java开发环境…