本例中,我们会使用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