我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解Java执行groovy脚本的两种方式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解Java执行groovy脚本的两种方式

记录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;


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脚本的两种方式的文章就介绍到这了,更多相关Java执行groovy脚本内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解Java执行groovy脚本的两种方式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

c#动态执行脚本的3种方式详解

本文主要介绍了c#动态执行脚本的3种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-14

shell脚本5种执行方式及脚本不同的执行方法和区别详解

目录前言概述正题一、方式1绝对路径和方式2相对路径,可以归纳为同一种方法二、方式3使用 sh/bash命令来执行三、方式4使用 . (空格)脚本名称来执行四、方式5使用 source 来执行(主要用于生效配置文件)区别1.关于执行权限2.关
2022-07-19

shell脚本4种执行方式

linux中shell脚本的执行通常有4种方式,分别为工作目录执行,绝对路径执行,sh执行,shell环境执行。 首先,看下我们的脚本内容[tan@tan scripts]$ ll total 4 -rw-rw-r--. 1 tan
2022-06-04

Java调用groovy脚本的方式分享

Groovy 是一种基于 JVM 的动态语言,与 Java 语言紧密集成,可以很方便地在 Java 项目中使用。本文为大家整理了Java调用groovy脚本的几种方式,希望对大家有所帮助
2023-05-15

详解shell中脚本参数传递的两种方式

方式一:$0,$1,$2.. 采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${10},${11}....才能获
2022-06-04

crontab实现每隔多少天执行一次脚本的两种方法

前言 我们大家在工作中,经常会碰到每隔多少天/小时/分钟执行一次脚本,或某个命令的情况。如果是每隔多少小时,多少分运行一次程序,在crontab中可能比较好实现一些,下面是一些示例及crontab的格式说明:具体示例:# 下午6点到早上6点
2022-06-04

Linux执行脚本的方式有哪些

Linux执行脚本的方式有以下几种:1. 使用命令行执行脚本:在终端中输入脚本的路径和名称,例如 `./script.sh`。2. 使用解释器执行脚本:在脚本的第一行指定解释器的路径,例如 `#!/bin/bash`,然后在终端中直接输入脚
2023-09-27

Java详解ScriptEngine接口动态执行JS脚本

ScriptEngine是基本接口,其方法必须在本规范的每个实现中完全起作用。这些方法提供基本脚本功能。写入这个简单接口的应用程序可以在每个实现中进行最少的修改。它包括执行脚本的方法,以及设置和获取值的方法
2022-11-13

shell脚本的执行方式有哪些

今天就跟大家聊聊有关shell脚本的执行方式有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先,看下我们的脚本内容[tan@tan scripts]$ lltotal 4-rw
2023-06-09

让Python脚本暂停执行的几种方法

转自:让Python脚本暂停执行的几种方法 1.time.sleep(secs)     参考文档原文: Suspend execution for the given number of seconds. The argument may
2023-01-31

详解Shell脚本中调用另一个Shell脚本的三种方式

主要以下有几种方式:CommandExplanationfork新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 She
2022-06-04

Java唤醒本地应用的两种方法详解

这篇文章主要为大家介绍了Java唤醒本地应用的两种方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

c#动态执行脚本的方式有哪些

这篇文章主要介绍“c#动态执行脚本的方式有哪些”,在日常操作中,相信很多人在c#动态执行脚本的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”c#动态执行脚本的方式有哪些”的疑惑有所帮助!接下来,请跟
2023-07-05

Python脚本后台运行的几种方式

一个用python写的监控脚本test1.py,用while True方式一直运行,在ssh远程(使用putty终端)时通过以下命令启动脚本:python test1.py &现在脚本正常运行,通过ps能看到进程号,此时直接关闭ssh终端(
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录