1、依赖
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>3.0.9</version>
<type>pom</type>
</dependency>
2、工具类
package com.example.datacollector.support.groovy;
import cn.hutool.core.map.MapUtil;
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* GroovyExecutorUtil
*
* @author ygr
* @date 2021/11/29 23:29
*/
@Slf4j
public class GroovyExecutorUtil {
private static final GroovyClassLoader CLASS_LOADER = new GroovyClassLoader();
public static Object execute(String scriptText, String methodName, Map<String, Object> contextParams, Object... args)
throws Exception {
Class<?> groovyClass = CLASS_LOADER.parseClass(scriptText);
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
if (MapUtil.isNotEmpty(contextParams)) {
// 将map中的值设置为脚本属性,在脚本中可以直接调用
contextParams.forEach(groovyObject::setProperty);
}
return groovyObject.invokeMethod(methodName, args);
}
}
3、测试
public static void main(String[] args) throws Exception {
String content = "import cn.hutool.core.util.StrUtil\n" +
"\n" +
"\n" +
"def sayHello(name) {\n" +
" println date?.getTime()\n" +
" println(\"my name is $name\");\n" +
" def reverse = StrUtil.reverse(\"hello\")\n" +
" println reverse\n" +
" def list = []\n" +
" if(list) {\n" +
" println 'not empty'\n" +
" } else {\n" +
" println 'empty~'\n" +
" }\n" +
" def obj = [name:'jack',detail:[[roleName:'admin']]]\n" +
" def role = obj.detail?[0]?.roleName\n" +
" println role\n" +
" obj.age = 20\n" +
" println obj\n" +
" \"success\"\n" +
"}";
Map<String, Object> params = new HashMap<>();
params.put("date", new Date());
long start = System.currentTimeMillis();
Object execute = GroovyExecutorUtil.execute(content, "sayHello", params, "ygr");
System.out.println(System.currentTimeMillis() - start);
System.out.println(execute);
/*输出结果如下
1638669552206
my name is ygr
olleh
empty~
admin
[name:jack, detail:[[roleName:admin]], age:20]
885
success
*/
}