首页 > 编程语言 > 详细

Java执行groovy脚本的两种方式

时间:2021-04-21 16:29:50      阅读:45      评论:0      收藏:0      [点我收藏+]
 

记录Java执行groovy脚本的两种方式,简单粗暴:

一种是通过脚本引擎ScriptEngine提供的eval(String)方法执行脚本内容;一种是执行groovy脚本;

二者都通过Invocable来传递参数并获取执行结果;

Invocable:脚本引擎的解释器接口,提供invokeFunctioninvokeMethod两种传递参数并获取执行结果的方法,Java JDK API文档解释如下:
技术分享图片

invokeFunction:
技术分享图片

invokeMethod:
技术分享图片

以下为案例:

引入依赖

<dependency>
	<groupId>org.codehaus.groovy</groupId>
	<artifactId>groovy-all</artifactId>
	<version>1.2.74</version>
</dependency>

定义脚本内容并执行

public void testByFunction(){
    // 初始化Bindings
    Bindings bindings = engine.createBindings();
    // 绑定参数
    bindings.put("date", new Date());
    final String name = "groovy";
    // 定义groovy脚本中执行方法的名称
    final String scriptName = "execute";
    // 定义groovy脚本内容
    final String scriptContent = "def " + scriptName +"(name){" +
                                 "    println(\"now dateTime is: ${date.getTime()}\");" +
                                 "    println(\"my name is $name\");" +
                                 "    return date.getTime() > 0;" +
                                 "}";
    try {
        // 执行脚本
        engine.eval(scriptContent, bindings);
        // 获取执行结果
        Invocable invocable = (Invocable) engine;
        Boolean flag = (Boolean) invocable.invokeFunction(scriptName, name);
        System.out.println("---------------------------------------");
        System.out.println("result is: " + flag);
    } catch (ScriptException | NoSuchMethodException e) {
        e.printStackTrace();
    }
}

运行结果:
技术分享图片

  • invokeFunction方法的第一个参数为脚本的函数名称,把scriptName拎出来通过创建String对象再赋值进去,方便你看懂函数名称到底是哪个;
  • scriptContent${date.getTime()}$name的意思一样,grovvy中的字符串可以识别${}$占位符;
  • bindings绑定参数与invokeFunction方法的第二个参数的区别是,前者是脚本内全局的,而后者是定义在函数内的;

例如把脚本内容定义为这样:
技术分享图片

执行结果就是这样了:
技术分享图片

实例化脚本对象并执行

public void testByMethod(){
    try {
        // 初始化groovy脚本对象
        final TestGroovy testGroovy = new TestGroovy();
        // 定义groovy脚本中执行方法的名称
        final String scriptName = "execute";
        // 定义参数
        final Date arg_1 = new Date();
        final String arg_2 = "groovy";
        // 执行脚本并获取结果
        Invocable invocable = (Invocable) engine;
        Boolean flag = (Boolean) invocable.invokeMethod(testGroovy, scriptName, arg_1, arg_2);
        System.out.println("---------------------------------------");
        System.out.println("result is: " + flag);
    } catch (ScriptException |NoSuchMethodException e) {
        e.printStackTrace();
    }
}

TestGroovy.groovy脚本内容:

package com.dandelion.groovy

class TestGroovy {
   static def execute(Date date, String name){
        println("now dateTime is: ${date.getTime()}");
        println("my name is $name");
        return date.getTime() < 0;
    }
}

运行结果:
技术分享图片

  • invokeMethod方法的第一个参数是脚本对象,第二个参数是脚本中的函数名称,之后为绑定的参数;

源码:

package com.dandelion.test;

import com.dandelion.groovy.TestGroovy;

import javax.script.*;
import java.util.Date;

/**
 * ================================
 * 测试groovy脚本的执行方式
 * @Author Him
 * @Date 2021-04-21
 * @Time 01:12
 * ================================
 */
public class TestScriptEngine {

    // 查找并创建指定脚本引擎
    private ScriptEngine engine = new ScriptEngineManager().getEngineByName("groovy");

    public void testByFunction(){
        // 初始化Bindings
        Bindings bindings = engine.createBindings();
        // 绑定参数
        bindings.put("date", new Date());
        // 定义groovy脚本中执行方法的名称
        final String scriptName = "execute";
        // 定义groovy脚本内容
        final String scriptContent = "def " + scriptName +"(){" +
                                     "    println(\"now dateTime is: ${date.getTime()}\");" +
                                     "    return date.getTime() > 0;" +
                                     "}";
        try {
            // 执行脚本
            engine.eval(scriptContent, bindings);
            // 获取执行结果
            Invocable invocable = (Invocable) engine;
            Boolean flag = (Boolean) invocable.invokeFunction(scriptName);
            System.out.println("---------------------------------------");
            System.out.println("result is: " + flag);
        } catch (ScriptException | NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public void testByMethod(){
        try {
            // 初始化groovy脚本对象
            final TestGroovy testGroovy = new TestGroovy();
            // 定义groovy脚本中执行方法的名称
            final String scriptName = "execute";
            // 定义参数
            final Date arg_1 = new Date();
            final String arg_2 = "groovy";
            // 执行脚本并获取结果
            Invocable invocable = (Invocable) engine;
            Boolean flag = (Boolean) invocable.invokeMethod(testGroovy, scriptName, arg_1, arg_2);
            System.out.println("---------------------------------------");
            System.out.println("result is: " + flag);
        } catch (ScriptException |NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        TestScriptEngine engine = new TestScriptEngine();
        engine.testByFunction();
    }
}

Java执行groovy脚本的两种方式

原文:https://www.cnblogs.com/M78-u-p/p/14683695.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!