class RecScript extends Script { @Override Object run() { return null } static Object addYear(String str, int num){ def (localDate, formatter) = formatLocalTate(str) def months = localDate.plusYears(num) return formatter.format(months) } static Object addMonth(String str, int num){ def (localDate, formatter) = formatLocalTate(str) def months = localDate.plusMonths(num) return formatter.format(months) } static Object addDay(String str, int num){ def (localDate, formatter) = formatLocalTate(str) def months = localDate.plusDays(num) return formatter.format(months) } private static List formatLocalTate(String str) { def formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss") def localDate = LocalDateTime.parse(str, formatter) [localDate, formatter] } }
class RecTimeSupport { private static final Object lock = new Object() private static final GroovyShell shell private static HashMap<String, Script> cache = new HashMap<String, Script>() static { CompilerConfiguration cfg = new CompilerConfiguration() cfg.setScriptBaseClass(RecScript.class.getName()) shell = new GroovyShell(cfg) } static Object parseExpr(String expr) { Script s = getScriptFromCache(expr) return s.run() } static Object parseExpr(String expr, Map<?, ?> map) { Binding binding = new Binding(map) Script script = getScriptFromCache(expr) script.setBinding(binding) return script.run() } private static Script getScriptFromCache(String expr) { if (cache.containsKey(expr)) { return cache.get(expr) } synchronized (lock) { if (cache.containsKey(expr)) { return cache.get(expr) } Script script = shell.parse(expr) cache.put(expr, script) return script } } static void main(String[] args) { def str = "ORDER_TIME == addMonth(ACT_TIME,2)" def map = [:] map.'ORDER_TIME' = '20190613121212' map.'ACT_TIME' = '20190413121212' // 绑定参数实例 println parseExpr(str,map) // 未绑定参数 println parseExpr("3+4") } }
一个脚本总是编译成class。Groovy编译器将为您编译该类,并将脚本主体复制到run
方法中