Fel是開放的,引擎執行中的多個模塊都可以擴展或替換。Fel的執行主要是通過函數實現,運算符(+、-等都是Fel函數),所有這些函數都是可以替換的,擴展函數也非常簡單。
Fel有雙引擎,同時支持解釋執行和編譯執行。可以根據性能要求選擇執行方式。編譯執行就是將表達式編譯成字節碼(生成java代碼和編譯模塊都是可以擴展和替換的)
FEL可以進行算數運算以及邏輯運算,也可以調用類的靜態方法、非靜態方法。
只需要一個jar包:
1. 簡單使用
1. 簡單計算
private static void calculate() { // 算數運算 FelEngine fel = new FelEngineImpl(); 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 void variables() { // 變量 FelEngine fel = new FelEngineImpl(); 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 void object() { FelEngine fel = new FelEngineImpl(); FelContext ctx = fel.getContext(); User user = new User(1, "qqq", "中國北京"); ctx.set("user", user); Map<String, String> map = new HashMap<String, String>(); 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 void method() { FelEngine fel = new FelEngineImpl(); FelContext ctx = fel.getContext(); ctx.set("out", System.out); ctx.set("StringUtils", new StringUtils()); 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 void staticMethod() { // 調用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 void collections() { FelEngine fel = new FelEngineImpl(); 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<Integer> list = Arrays.asList(1, 2, 3); ctx.set("list", list); // 獲取list.get(0) exp = "list[0]"; System.out.println(exp + "->" + fel.eval(exp)); // 集合 Collection<String> coll = Arrays.asList("a", "b", "c"); ctx.set("coll", coll); // 獲取集合最前面的元素。執行結果為"a" exp = "coll[0]"; System.out.println(exp + "->" + fel.eval(exp)); // 迭代器 Iterator<String> iterator = coll.iterator(); ctx.set("iterator", iterator); // 獲取迭代器最前面的元素。執行結果為"a" exp = "iterator[0]"; System.out.println(exp + "->" + fel.eval(exp)); // Map Map<String, String> m = new HashMap<String, String>(); 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<int[]> listArray = new ArrayList<int[]>(); 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 void compile() { FelEngine fel = new FelEngineImpl(); 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 void myContext() { FelContext ctx = new AbstractContext() { @Override public Object get(String arg0) { System.out.println(arg0); return "111222"; } }; FelEngine fel = new FelEngineImpl(ctx); Object eval = fel.eval("天氣 + 溫度"); System.out.println(eval); }
結果:
天氣
溫度
111222111222
3. 自定義函數
private static void newFun() { // 定義hello函數 Function fun = new CommonFunction() { public String getName() { return "hello"; } @Override public Object call(Object[] arguments) { Object msg = null; if (arguments != null && arguments.length > 0) { msg = arguments[0]; } return ObjectUtils.toString(msg); } }; FelEngine e = new FelEngineImpl(); // 添加函數到引擎中。 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