在项目开发中可能会遇到这样的需求,要求实现一个公式配置,用户配置公式中的参数,运行中动态替换参数并计算公式的结果。当然可以自己定义表达式的规则,并解析计算,但明显代码量大且不容易扩展。也可以考虑使用第三方的表达式工具来实现。

这里我们将表达式配置为Javascript脚本,并通过JDK自带脚本引擎来执行的方式,可以达到快速实现并易于扩展的目的。

 

 
  
  1. ScriptEngineManager sem = new ScriptEngineManager(); 
  2.          
  3.         // 创建一个Map用来存放变量 
  4.         SimpleBindings bindings = new SimpleBindings(); 
  5.  
  6.         bindings.put("param1"new Long(10)); 
  7.         bindings.put("param2"new Long(20)); 
  8.  
  9.         // 获取JS引擎 
  10.         ScriptEngine engine = sem.getEngineByExtension("js"); 
  11.         engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE); 
  12.  
  13.         try { 
  14.              
  15.             // 执行脚本 
  16.             Object res = engine.eval(" res = Math.max(param1 , param2)"); 
  17.             System.out.println(res); 
  18.              
  19.             // 创建脚本 
  20.             String script = "function getMax() " 
  21.                     + "{ return Math.max(param1 , param2)}"
  22.              
  23.             // 执行脚本 
  24.             engine.eval(script); 
  25.              
  26.             // 在以前执行过的脚本中调用程序 
  27.             Invocable inv = (Invocable) engine; 
  28.              
  29.             // 执行方法 
  30.             Object res1 = inv.invokeFunction("getMax"null); 
  31.             System.out.println(res1); 
  32.  
  33.             // 将参数直接写入表达式计算 
  34.             Object res2 = engine.eval("param1*4/(param1%2+55)"); 
  35.             System.out.println(res2); 
  36.              
  37.         } catch (Exception ex) { 
  38.             ex.printStackTrace(); 
  39.         }