在项目开发中可能会遇到这样的需求,要求实现一个公式配置,用户配置公式中的参数,运行中动态替换参数并计算公式的结果。当然可以自己定义表达式的规则,并解析计算,但明显代码量大且不容易扩展。也可以考虑使用第三方的表达式工具来实现。
这里我们将表达式配置为Javascript脚本,并通过JDK自带脚本引擎来执行的方式,可以达到快速实现并易于扩展的目的。
- ScriptEngineManager sem = new ScriptEngineManager();
- // 创建一个Map用来存放变量
- SimpleBindings bindings = new SimpleBindings();
- bindings.put("param1", new Long(10));
- bindings.put("param2", new Long(20));
- // 获取JS引擎
- ScriptEngine engine = sem.getEngineByExtension("js");
- engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
- try {
- // 执行脚本
- Object res = engine.eval(" res = Math.max(param1 , param2)");
- System.out.println(res);
- // 创建脚本
- String script = "function getMax() "
- + "{ return Math.max(param1 , param2)}";
- // 执行脚本
- engine.eval(script);
- // 在以前执行过的脚本中调用程序
- Invocable inv = (Invocable) engine;
- // 执行方法
- Object res1 = inv.invokeFunction("getMax", null);
- System.out.println(res1);
- // 将参数直接写入表达式计算
- Object res2 = engine.eval("param1*4/(param1%2+55)");
- System.out.println(res2);
- } catch (Exception ex) {
- ex.printStackTrace();
- }
转载于:https://blog.51cto.com/elminstre/816913