花满天的季节
盼望着,盼望着,三月悄然来了。
一切都像刚睡醒的样子,犹如婴儿缓缓睁眼。
粉粉嫩嫩的花儿开始羞涩起来,
沉闷程序猿小哥哥开始躁动起来
小 E 也带着小妹妹悠悠公园深处。
万物生长
闷闷直男小 E,带着小妹妹压着公园马路看着桃花内心小小的烂漫,话虽不多不爱自拍,但小妹妹在不爱自拍也融于这美美桃花之中,尽可能的绣着恩爱。
甜蜜中
突如其来
我的美梦就这样破碎了
ヽ`、 、ヽ`、还没到三伏天的大雨ヽ`、ヽ、ヽ`ヽヽ、
ヽ`、ヽ ヽ烦人逗比经理电话来了 、 ヽ`、ヽ、ヽ`、ヽ、ヽ`、
ヽ、ヽ 、ヽ`、ヽ、ヽ`、ヽ
Fel 在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求。
Fel 是开放的,引擎执行中的多个模块都可以扩展或替换。Fel 的执行主要是通过函数实现,运算符(+、-等都是 Fel 函数),所有这些函数都是可以替换的,扩展函数也非常简单。
Fel 有双引擎,同时支持解释执行和编译执行。可以根据性能要求选择执行方式。编译执行就是将表达式编译成字节码(生成 java 代码和编译模块都是可以扩展和替换的)
Fel 基于 Java1.5 开发,适用于 Java1.5 及以上版本。
通常情况下,Fel-0.7 每秒可以执行千万次表达式(不包含编译时间)。速度是 Jexl-2.0 的 20 倍以上。
目前还没有发现开源的表达式引擎比 Fel 快。
项目虽然很久很久没有进行更新,但现有 BUG 甚少。最新版本为 0.9,但 maven 只到 0.8😭
<dependency>
<groupId>org.eweb4j</groupId>
<artifactId>fel</artifactId>
<version>0.8</version>
</dependency>
算术表达式:
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 版本)
为了防止出现“${'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 的公众号: 墨鲸说话
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.