java fel_FEL表达式的用法

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

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

FEL可以进行算数运算以及逻辑运算,也可以调用类的静态方法、非静态方法。

只需要一个jar包:

617096d0c6630a547360992ad3e25821.png

1.  简单使用

1.  简单计算

private static voidcalculate() {//算数运算

FelEngine fel = newFelEngineImpl();

Object result= fel.eval("1.5898*1+75");

System.out.println(result);//逻辑运算

Object result2 = fel.eval("1 == 2 || '1'.equals('1')");

System.out.println(result2);

}

结果:

76.5898

true

2.   变量用法

private static voidvariables() {//变量

FelEngine fel = newFelEngineImpl();

FelContext ctx=fel.getContext();

ctx.set("单价", 1.5898);

ctx.set("数量", 1);

ctx.set("运费", 75);

Object result= fel.eval("单价*数量+运费");

System.out.println(result);

}

结果:

76.5898

3.  访问对象的方法

private static voidobject() {

FelEngine fel= newFelEngineImpl();

FelContext ctx=fel.getContext();

User user= new User(1, "qqq", "中国北京");

ctx.set("user", user);

Map map = new HashMap();

map.put("name", "qqq");

ctx.set("map", map);//调用user.getName()方法。

System.out.println(fel.eval("user.name"));//map.name会调用map.get("name");

System.out.println(fel.eval("map.name"));

}

qqq

qqq

例如:访问StringUtils方法的第一种方式

private static voidmethod() {

FelEngine fel= newFelEngineImpl();

FelContext ctx=fel.getContext();

ctx.set("out", System.out);

ctx.set("StringUtils", newStringUtils());

Object eval= fel.eval("out.println('Hello Everybody'.substring(6))");

Object eval2= fel.eval("StringUtils.isEmpty('')");

System.out.println(eval);

System.out.println(eval2);

}

4.  访问静态方法

访问StringUtils的方法:

private static voidstaticMethod() {//调用Math.min(1,2)

Object eval = FelEngine.instance.eval("$('Math').min(1,2)");

System.out.println(eval);//调用Stringutils的方法

Object eval1 = FelEngine.instance.eval("$('org.apache.commons.lang.StringUtils').isEmpty('123')");

System.out.println(eval1);

}

结果:

1

false

注意:如果不加包名会默认调用java.lang包下的,即使类是默认包的也会访问java.lang包的,所以最好加包名。

5.  访问集合

private static voidcollections() {

FelEngine fel= newFelEngineImpl();

FelContext ctx=fel.getContext();//数组

int[] intArray = { 1, 2, 3};

ctx.set("intArray", intArray);//获取intArray[0]

String exp = "intArray[0]";

System.out.println(exp+ "->" +fel.eval(exp));//List

List list = Arrays.asList(1, 2, 3);

ctx.set("list", list);//获取list.get(0)

exp = "list[0]";

System.out.println(exp+ "->" +fel.eval(exp));//集合

Collection coll = Arrays.asList("a", "b", "c");

ctx.set("coll", coll);//获取集合最前面的元素。执行结果为"a"

exp = "coll[0]";

System.out.println(exp+ "->" +fel.eval(exp));//迭代器

Iterator iterator =coll.iterator();

ctx.set("iterator", iterator);//获取迭代器最前面的元素。执行结果为"a"

exp = "iterator[0]";

System.out.println(exp+ "->" +fel.eval(exp));//Map

Map m = new HashMap();

m.put("name", "HashMap");

ctx.set("map", m);

exp= "map.name";

System.out.println(exp+ "->" +fel.eval(exp));//多维数组

int[][] intArrays = { { 11, 12 }, { 21, 22} };

ctx.set("intArrays", intArrays);

exp= "intArrays[0][0]";

System.out.println(exp+ "->" +fel.eval(exp));//多维综合体,支持数组、集合的任意组合。

List listArray = new ArrayList();

listArray.add(new int[] { 1, 2, 3});

listArray.add(new int[] { 4, 5, 6});

ctx.set("listArray", listArray);

exp= "listArray[0][0]";

System.out.println(exp+ "->" +fel.eval(exp));

}

2.  高级用法

1.  编译运行

private static voidcompile() {

FelEngine fel= newFelEngineImpl();

FelContext ctx=fel.getContext();

ctx.set("单价", 1.5898);

ctx.set("数量", 1);

ctx.set("运费", 75);

Expression exp= fel.compile("单价*数量+运费", ctx);

Object result=exp.eval(ctx);

System.out.println(result);

}

结果:

76.5898

2.  自定义context

private static voidmyContext() {

FelContext ctx= newAbstractContext() {

@OverridepublicObject get(String arg0) {

System.out.println(arg0);return "111222";

}

};

FelEngine fel= newFelEngineImpl(ctx);

Object eval= fel.eval("天气 + 温度");

System.out.println(eval);

}

结果:

天气

温度

111222111222

3.  自定义函数

private static voidnewFun() {//定义hello函数

Function fun = newCommonFunction() {publicString getName() {return "hello";

}

@OverridepublicObject call(Object[] arguments) {

Object msg= null;if (arguments != null && arguments.length > 0) {

msg= arguments[0];

}returnObjectUtils.toString(msg);

}

};

FelEngine e= newFelEngineImpl();//添加函数到引擎中。

e.addFun(fun);

String exp= "hello(23, 'fel', 1)";//解释执行

Object eval =e.eval(exp);

System.out.println("hello " +eval);//编译执行

Expression compile = e.compile(exp, null);

eval= compile.eval(null);

System.out.println("hello " +eval);

}

结果:

hello 23

hello 23

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值