登录
    Technology changes quickly but people's minds change slowly.

在java 程序中使用groovy 脚本

技术宅 破玉 1269次浏览 0个评论

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

华裳绕指柔, 版权所有丨如未注明 , 均为原创|转载请注明在java 程序中使用groovy 脚本
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址