groovy简介
Groovy是一种基于Java平台的面向对象语言。 Groovy 1.0于2007年1月2日发布,其中Groovy 2.5是当前的主要版本。 Groovy通过Apache License v 2.0发布。
Groovy的特点
Groovy中有以下特点:
- 同时支持静态和动态类型。
- 支持运算符重载。
- 本地语法列表和关联数组。
- 对正则表达式的本地支持。
- 各种标记语言,如XML和HTML原生支持。
- Groovy对于Java开发人员来说很简单,因为Java和Groovy的语法非常相似。
- 您可以使用现有的Java库。
- Groovy扩展了java.lang.Object。
Groovy的官方网站是
环境搭建省略
在 idea 中使用groovy
java中调用groovy
有个需求,就是需要针对不同的测评提供不同的计算方式,为了每次增加测评不修改java代码,就考虑用groovy 动态脚本来代替java的算分部分。java程序算分时直接加载groovy脚本,脚本可以随时修改,增加新测评不影响java程序运行。
##### 在 java程序中加载 groovy脚本
参考: https://www.cnblogs.com/jizha/p/5027695.html
public class GroovyCommonUtil { static GroovyScriptEngine groovyScriptEngine; /** * 用于调用指定Groovy脚本中的指定方法 * * @param scriptName 脚本名称 * @param methodName 方法名称 * @param paramMap 方法参数 * @return */ @SuppressWarnings({"rawtypes"}) public static Object invokeMethod(String scriptName, String methodName, Map paramMap) throws Exception { PesFactorScoreDto pesFactorScoreDto; Object result; Class scriptClass; GroovyObject scriptInstance; Gson gson = new Gson(); try { scriptClass = groovyScriptEngine.loadScriptByName(scriptName); scriptInstance = (GroovyObject) scriptClass.newInstance(); } catch (Exception e) { e.printStackTrace(); System.out.println("加载脚本[" + scriptName + "]出现异常"); throw new Exception("加载脚本" + scriptName + "失败"); } try { result = scriptInstance.invokeMethod(methodName, paramMap); String json = gson.toJson(result); System.out.println(json); pesFactorScoreDto = gson.fromJson(json, PesFactorScoreDto.class); } catch (IllegalArgumentException e) { e.printStackTrace(); System.out.println("执行方法" + methodName + "参数出现异常, 参数为" + paramMap); throw new Exception("调用方法[" + methodName + "]失败,因参数不合法"); } catch (Exception e) { e.printStackTrace(); System.out.println("执行方法" + methodName + "参数出现异常, 参数为" + paramMap); throw new Exception("调用方法[" + methodName + "]失败"); } return pesFactorScoreDto; } /** * 加载脚本路径 * * @param clazz * @return */ public static String getProjectPath(Class clazz) { ApplicationHome home = new ApplicationHome(clazz); File jarFile = home.getSource(); java.net.URL url = clazz.getProtectionDomain().getCodeSource() .getLocation(); String filePath = null; try { filePath = java.net.URLDecoder.decode(url.getPath(), "UTF-8"); } catch (Exception e) { e.printStackTrace(); } // 当是jar 包时,获取jar 同级目录 if (filePath.contains(".jar")) { filePath = jarFile.getParentFile().toString() + "/script/"; } else { // 工程下,获取当前工程下的路径 java.io.File file = new java.io.File(filePath); filePath = file.getParent(); java.io.File file1 = new java.io.File(filePath); filePath = file1.getParent() + "/script/"; } System.out.println(filePath); return filePath; } /** * 设置脚本路径 * * @param path */ public static void loadScript(String path) { try { //该变量用于指明groovy脚本所在的父目录 String root[] = new String[]{path}; groovyScriptEngine = new GroovyScriptEngine(root); } catch (IOException e) { e.printStackTrace(); } } }
springBoot 启动时 加载脚本路径
@SpringBootApplication @ComponentScan public class App { public static void main(String[] args) { GroovyCommonUtil.loadScript(GroovyCommonUtil.getProjectPath(RptAnswerallApp.class)); SpringApplication.run(App.class, args); } }
调用方式
@Service public class PesGroovyExecService { public PesFactorScoreDto getPesFactorScore(Map paramMap){ try { PesFactorScoreDto pesFactorScoreDto= (PesFactorScoreDto) GroovyCommonUtil.invokeMethod("PesScale.groovy", "getPesFactorScore",paramMap); return pesFactorScoreDto; } catch (Exception e) { e.printStackTrace(); } return null; } }
groovy 入口脚本
PesFactorScore getPesFactorScore(Map paramMap){ def recordId=paramMap.get("recordId") def typeValue=paramMap.get("typeValue") def oldScoreStr=paramMap.get("oldScoreStr") def sex=paramMap.get("sex") def age=paramMap.get("age") // 根据字典拼装类名,实现动态加载 def className="com.rpt.pes.script.Scale_"+typeValue // 利用反射根据类名加载类 Class clazz=Class.forName(className) def app=clazz.newInstance() return app.getResult(recordId,typeValue,oldScoreStr,sex,age) }