最近学习了一下groovy,发现这门语言身上有scala的影子(或者相反)。使用起来非常的简洁,而且无缝调用java,真的非常棒。
那么反过来,java调用groovy呢?
由于groovy是动态语言(这里先不讨论groovy编译成字节码),java是静态编译的,所以java要调用groovy,编译器并不知道groovy会定义一些什么,所以就和java调用js的情况一样了(事实上都是java调用script)。
这里作了简单的封装
首先添加maven依赖
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>3.0.0-alpha-3</version>
<type>pom</type>
</dependency>
package utils.groovy;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.springframework.util.ResourceUtils;
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
public class GroovyScriptEngineHelper {
private String filepath = "";//目录
private GroovyScriptEngine engine ;
public GroovyScriptEngineHelper(String filepath){
try {
this.filepath = ResourceUtils.getFile(filepath).getAbsolutePath();;
this.engine = new GroovyScriptEngine(this.filepath);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public Object run(String scriptName,Map<String,Object> variables){
//groovy代码文件名
Object res;
try {
res = engine.run(scriptName, new Binding(variables));
} catch (Exception e) {
throw new RuntimeException(e);
}
return res;
}
public String getFilepath() {
return filepath;
}
public static void main(String[] args) throws FileNotFoundException{
Map<String, Object> variables = new HashMap<>();
String filename = "classpath:./";
Object res = new GroovyScriptEngineHelper(filename).run("groovy/Hello.groovy", variables);
System.out.println(res);
}
}
package utils.groovy;
import java.util.HashMap;
import java.util.Map;
import groovy.lang.GroovyObject;
public class GroovyScriptHelper {
/**
*
* @param classname
* 比如"hellogroovy.Hello"
* @return
*/
private static Map<String,GroovyObject> groovyClassCache = new HashMap<>();
public static GroovyObject loadGroovyScript(String classname) throws Exception {
return loadGroovyScript(classname,false);
}
/**
*
* @param classname
* @param useCache 使用缓存
* @return
* @throws Exception
*/
public static GroovyObject loadGroovyScript(String classname,boolean useCache) throws Exception {
if(useCache){
GroovyObject o = groovyClassCache.get(classname);
if(o!=null){
return o;
}
}
GroovyObject groovyObject = (GroovyObject) GroovyScriptHelper.class.getClassLoader().loadClass(classname)
.newInstance();
groovyClassCache.put(classname, groovyObject);
return groovyObject;
}
public static Object invokeMethod(GroovyObject groovyObject, String method, Object args) throws Exception {
Object res = groovyObject.invokeMethod(method, args);
return res;
}
public static void main(String[] args) {
}
}