java调用groovy

最近学习了一下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) {
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值