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)
}