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

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

文章目录

  • 详解Java执行groovy脚本的两种方式
    • 介绍
      • 记录`Java`执行`groovy`脚本的两种
      • invokeFunction:
      • invokeMethod:
      • 以下为案例:
        • 引入依赖
        • 定义脚本内容并执行
        • 运行结果:
        • 例如把脚本内容定义为这样:
        • 执行结果就是这样了:
        • 实例化脚本对象并执行
        • TestGroovy.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(){// 初始化BindingsBindings 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.groovyclass 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(){// 初始化BindingsBindings 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();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/142363.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 大厂八股文面试专题-JVM相关面试题 类加载器

Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式-CSDN博客 JVM相关面试题 1 JVM组成 1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f; 难易程度&#xff1a;☆☆☆ 出现频率&#xff1a;☆☆☆☆ JVM是什么 Java Virtual Machine Java程序…

Oracle VM VirtualBox安装并下载安装CentOS7

Oracle VM VirtualBox安装并下载安装CentOS7 Oracle VM VirtualBox下载CentOS创建虚拟机 Oracle VM VirtualBox VM下载链接 https://www.oracle.com/cn/virtualization/virtualbox/ 点击链接直接下载就行&#xff0c;下载完默认安装或者更改一下安装目录。 下载CentOS http://…

竞赛 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖&am…

面试题08.05.递归算法

递归乘法。 写一个递归函数&#xff0c;不使用 * 运算符&#xff0c; 实现两个正整数的相乘。可以使用加号、减号、位移&#xff0c;但要吝啬一些。 示例1: 输入&#xff1a;A 1, B 10输出&#xff1a;10示例2: 输入&#xff1a;A 3, B 4输出&#xff1a;12提示: 保证乘法…

【解决】Unity3D中无法在MQTT事件中执行Animator

问题原因&#xff1a; 解决方法&#xff1a; 解决过程 1、在 Unity 中创建一个名为 MainThreadDispatcher 的脚本&#xff0c;用于处理主线程操作。 using System.Collections.Generic; using UnityEngine;public class MainThreadDispatcher : MonoBehaviour {private stati…

JDK、JRE 和 JVM 的区别和联系

三者关系 就这三者的关系而言&#xff0c;jvm是jre的子集&#xff0c;jre是jdk的子集&#xff0c;具体关系如下图&#xff1a; Java的执行流程 对于一个Java程序&#xff0c;其执行流程大致如下&#xff1a; 开发人员使用JDK编写和编译Java源代码&#xff0c;生成Java字节码文…

【SQL server】数据库入门基本操作教学

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 前言 数据库是计算机系统中用于存储和管理数据的一种软件系统。它通常由一个或多个数据集合、管理系统和应用程序组成&#xff0c;被广泛应用于企业、政府和个人等各种领域。目前常用的数…

安防视频平台EasyCVR视频调阅全屏播放显示异常是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

KF32A学习笔记(一):工程导入、编译烧录方法(KF32 IDE+ KF32 PRO)

目录 概述KF32 IDE打开现有项目工程1.工程导入2.编译工程3.下载程序 KF32 PRO 概述 本文主要是对KF32A150芯片程序的编译、烧录方法进行说明。针对开发过程中的编译烧录和无代码情况下的烧录两种场景&#xff0c;需要安装ChipON PRO KF32和ChipON IDE KF32两个上位机工具&…

LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略

LLM之Colossal-LLaMA-2&#xff1a;Colossal-LLaMA-2的简介、安装、使用方法之详细攻略 导读&#xff1a;2023年9月25日&#xff0c;Colossal-AI团队推出了开源模型Colossal-LLaMA-2-7B-base。Colossal-LLaMA-2项目的技术细节&#xff0c;主要核心要点总结如下: >> 数据处…

最新ChatGPT网站系统源码+支持GPT4.0+支持AI绘画Midjourney绘画+支持国内全AI模型

一、SparkAI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&a…

Learn Prompt- Midjourney案例:动漫设计

使用 Midjourney 生成动漫有两种方法&#xff1a;使用Niji模式或使用标准的 Midjourney 模型。Niji V5 是 Midjourney 的动漫专用模型。它建立在标准 Midjourney 模型的全新架构之上&#xff0c;更擅长生成命名的动漫角色。Niji V4于2023年12月发布&#xff0c;Niji V5于2023年…

数据结构--快速排序

文章目录 快速排序的概念Hoare版本挖坑法前后指针法快速排序的优化三数取中法小区间用插入排序 非递归的快速排序 快速排序的概念 快速排序是通过二叉树的思想&#xff0c;先设定一个值&#xff0c;通过比较&#xff0c;比它大的放在它的右边&#xff0c;比它小的放在它的左边…

希望杯、希望数学系列竞赛辨析和希望数学超1G的真题和学习资源

中国的中小学数学竞赛种类非常多&#xff0c;但是说到全国性的数学竞赛&#xff0c;影响力最大的之一就是“希望杯”&#xff0c;在2017年国家喊停学科竞赛后&#xff0c;“希望杯”逐步停止了&#xff0c;但是鉴于希望杯的巨大影响力&#xff0c;以及背后的利益纠葛&#xff0…

LESS的叶绿素荧光模拟实现与操作

LESS的叶绿素荧光模拟实现与操作 前情提要FLUSPECT模型荧光的三维面元冠层辐射传输过程日光诱导叶绿素荧光模拟 前情提要 本文默认您对LESS (LargE-Scale remote sensing data and image Simulation framework) 模型和叶绿素荧光(Sun-Induced chlorophyll Fluorescence, SIF)有…

使用 Python 函数callable和isinstance的意义

一、说明 在这篇博客中&#xff0c;我们将探讨两个python函数&#xff1a;1 callable 中的函数及其有趣的应用程序。该callable函数用于检查对象是否可调用&#xff0c;这意味着它可以作为函数调用。2 isinstance这个内置函数允许我们比较两种不同的数据类型并确定它们是否相…

面试:Spring中单例模式用的是哪种?

你好&#xff0c;我是田哥 需要简历优化、模拟面试、面试辅导、技术辅导......请联系我。10年码农24小时在线为你服务。 面试中被问到设计模式的概率还是蛮高的&#xff0c;尤其是问&#xff1a;你在项目中用过设计模式吗&#xff1f; 面对这个问题&#xff0c;我也在做模拟面试…

蓝桥杯每日一题2023.9.22

4960. 子串简写 - AcWing题库 题目描述 题目分析 原本为纯暴力但是发现会超时&#xff0c;可以加入前缀和&#xff0c;从前往后先记录一下每个位置c1出现的次数 再从前往后扫一遍&#xff0c;如果遇到c2就将答案加上此位置前的所有c1的个数&#xff08;直接加上此位置的前缀…

React 全栈体系(十六)

第八章 React 扩展 五、Context 1. 代码 /* index.jsx */ import React, { Component } from react import ./index.css//创建Context对象 const MyContext React.createContext() const {Provider,Consumer} MyContext export default class A extends Component {state …

构建卓越语言模型应用的利器:LangChain | 开源日报 No.39

langchain-ai/langchain Stars: 61.3k License: MIT LangChain 是一个用于通过组合性构建 LLMs 应用程序的库。 LLMs 和 Prompts&#xff1a;包括 prompt 管理、prompt 优化、所有 LLM 的通用接口以及与 LLMs 一起使用的常见工具。Chains&#xff1a;超越单个 LLM 调用&…