groovy调用java_Java中加载Groovy文件及调用其方法

本例中,我们会使用GroovyClassLoader来加载groovy脚本。

GroovyClassLoader是一个定制的类装载器,负责解释加载Java类中用到的Groovy类。它也能编译。清单2.21展示了如何使用GroovyClassLoader加载Groovy类并且调用该类的一个方法。

@Component

public class AccessComputeService {

public static final Logger logger = LoggerFactory.getLogger(AccessComputeService.class);

private static GroovyClassLoader loader;

private static final ConcurrentHashMap groovyObjects = new ConcurrentHashMap<>();

static {

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

loader = new GroovyClassLoader(AccessComputeService.class.getClassLoader());

try {

//适配读取classpath下面的*.groovy文件列表

Resource[] resources = resolver.getResources("classpath:accessScore/*.groovy");

if(resources==null || resources.length==0){

logger.warn("未获取到groovy文件");

}else{

for (Resource resource: resources) {

try ( InputStream inputStream = AccessComputeService.class.getClassLoader()

.getResourceAsStream("accessScore/" + resource.getFilename())){

logger.info("加载准入评分groovy脚本:{}", resource.getFilename());

String text = CharStreams.toString(new InputStreamReader(inputStream, "UTF-8"));

Class groovyClass = loader.parseClass(text,resource.getFilename());

GroovyObject scriptInstance = (GroovyObject)groovyClass.newInstance();

groovyObjects.put(resource.getFilename().split("\\.")[0],scriptInstance);

}

}

}

} catch (Exception e) {

logger.error("groovy 引擎初始化失败!!!!!!!!",e);

}

}

public void execute(String scriptFileName, String scriptFunctionName, Map dataMap) {

//scriptFileName:文件名,scriptFunctionName:文件的方法,dataMap:参数

Strong result = (String)groovyObjects.get(scriptFileName).invokeMethod(scriptFunctionName, dataMap);

}

}

其他调用groovy的方式:(共5种)

1.编译成字节码(直接调编译后的.class文件)

2.使用GroovyShell && Bingding

(groovyShell.evaluate("groovy code"); binding.setVariable/getVariable)

3.使用GroovyScriptEngine && Bingding

(groovyScriptEngineengine.run("groovyCode.groovy", binding); binding.setVariable/getVariable)

4.使用GroovyClassLoader

(详见代码,class = loader.parseClass; groovyObject = class.newInstance; groovyObject.invokeMethod)

5.使用JSR223(Java 6 开始有的,支持JavaScript、JRuby、Jython和Groovy)

scriptEngine = scriptEngineManager.getEngineByName("groovy")

scriptEngine.eval

inv = (Invocable) engine;

inv.invokeFunction("hello", new Object[]{...});

summarize from

http://blog.youkuaiyun.com/eric_sunah/article/details/11541307

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值