学习 Janino(三):Script Evaluator

Script Evaluator 用于动态执行 Java 代码块。

计算客单价,即 amount 金额除以 count 人数,四舍五入:

IScriptEvaluator se = CompilerFactoryFactory.getDefaultCompilerFactory().newScriptEvaluator(); // ①

se.setDefaultImports("java.math.BigDecimal"); // ②  
se.setParameters(new String[]{"amount", "count"}, new Class[]{double.class, long.class}); // ③  
se.setReturnType(double.class); // ④

se.cook("" +  
        "if (count == 0) return 0.0;\n" +
        "BigDecimal amountBigDecimal = BigDecimal.valueOf(amount);\n" +
        "BigDecimal countBigDecimal = BigDecimal.valueOf(count);\n" +
        "return amountBigDecimal.divide(countBigDecimal, BigDecimal.ROUND_HALF_UP).doubleValue();"); // ⑤

se.evaluate(new Object[]{100.0, 2L}); // ⑥  

① 使用工厂模式创建默认的 Script Evaluator 实例;

② 默认引入 java.math.BigDecimal 类,或者在 Java 代码块中显式引入 import java.math.BigDecimal;

③ 设置参数名和参数类型;

④ 设置返回值类型;

⑤ 编译 Java 代码块;

⑥ 执行 Java 代码块。