groovy
import java.io.File;
import java.net.URL;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyCodeSource;
import groovy.lang.Script;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class GroovyCompiler {
private static Map<String, GroovyClass> groovyCaches = new ConcurrentHashMap<String, GroovyClass>();
private static ClassLoader cl = GroovyCompiler.class.getClassLoader();
private static GroovyClassLoader groovyCl = new GroovyClassLoader(cl);
public static GroovyClass getClass(File script){
if(script == null || !script.exists()){
return null;
}
try {
String fileName = script.getPath() ;
GroovyClass groovyClazz = groovyCaches.get(fileName);
//cached,check if modified
if(groovyClazz != null){
long lastModified = script.lastModified();
//newest
if(lastModified <= groovyClazz.getLastmodified() ){
return groovyClazz;
}
//update cache
groovyClazz = null;
}
//need new a Instance
//not use GroovyClassLoader cache
Class<?> groovyClass = groovyCl.parseClass(new GroovyCodeSource(script, "UTF-8"),false);
groovyClazz = new GroovyClass((Script)groovyClass.newInstance(),script.lastModified());
groovyCaches.put(fileName, groovyClazz);
return groovyClazz;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static GroovyClass getClass(URL script){
return getClass(new File(script.getFile()));
}
public static GroovyClass getClass(String script){
return getClass(cl.getResource(script));
}
public static class GroovyClass {
public GroovyClass(){
}
public GroovyClass(Script script,long lastmodified){
this.script = script;
this.lastmodified = lastmodified;
}
Script script;
long lastmodified = 0;
public Script getScript() {
return script;
}
public void setScript(Script script) {
this.script = script;
}
public long getLastmodified() {
return lastmodified;
}
public void setLastmodified(long lastmodified) {
this.lastmodified = lastmodified;
}
public Object invoke(String methosName, Object[] args) {
return script.invokeMethod(methosName, args);
}
public Object get() {
return script.run();
}
public Object get(Map binds) {
script.getBinding().getVariables().putAll(binds);
Object obj = script.run();
return obj;
}
}
}
使用
public class GroovyKest {
public static void main(String[] args) throws Exception {
GroovyClass groovy = GroovyCompiler.getClass("script/view.groovy");
Map <String,String> context = new HashMap<>();
context.put("name", "kan");
Object obj = groovy.get(context);
System.out.println(obj);
}
}