groovy是基于JVM的一种敏捷动态语言,可以在不改动正在运行着程序的情况下为系统动态增加特性
方法一:通过类加载
import groovy.lang.Binding; import groovy.lang.GroovyClassLoader; import groovy.lang.Script; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.List; import org.codehaus.groovy.runtime.InvokerHelper; import com.google.common.collect.Maps; public class GroovyTest { static class MyBinding extends Binding { private HashMap<String, Object> variables = Maps.newHashMap(); public void setVariable(String name, Object binding) { variables.put(name, binding); } public Object getVariable(String name) { return variables.get(name); } } public static void main(String[] args) { String log = "Hi, test one, split with comma"; GroovyClassLoader classLoader = new GroovyClassLoader (); Class<?> scriptClass = classLoader.parseClass(getGroovyString()); Script script = InvokerHelper.createScript(scriptClass, new MyBinding()); List<String> ret = (List<String>)script.invokeMethod("parse", new Object[]{log}); System.out.println(ret); } private static String getGroovyString() { StringBuilder ret = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader(GroovyTest.class.getClassLoader() .getResourceAsStream("GroovyScript"))); String line; try { while ((line = reader.readLine()) != null) { ret.append(line).append("\n"); } } catch (IOException e) { throw new RuntimeException(e); } return ret.toString(); } }
测试结果为:
其中文本文件GroovyScript为
import org.apache.commons.lang.StringUtils;
List<String> parse(String log) {
List<String> ret = new ArrayList<String>();
for (field in StringUtils.split(log, ",")) {
ret.add(field);
}
return ret;
}
方法二:通过evaluate
@Test public void test() { Binding binding = new Binding(); binding.setVariable("$name", "zhiyuan"); binding.setVariable("$age", 28); binding.setVariable("$salary", 1000); GroovyShell shell = new GroovyShell(binding); String groovyExp = "return ($name.contains('hiy') && $age > 27) || $salary <= 1000"; Boolean val = (Boolean)shell.evaluate(groovyExp); if (val) { System.out.println(groovyExp); } }