软件编程
位置:首页>> 软件编程>> java编程>> 详解Java执行groovy脚本的两种方式

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

作者:蒲公英不是梦  发布时间:2021-05-28 09:23:27 

标签:Java,groovy,脚本

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

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

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

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

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

invokeFunction:

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

invokeMethod:

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

以下为案例:

引入依赖


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

运行结果:

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

  • invokeFunction方法的第一个参数为脚本的函数名称,把scriptName拎出来通过创建String对象再赋值进去,方便你看懂函数名称到底是哪个;

  • scriptContent${date.getTime()}$name的意思一样,grovvy中的字符串可以识别${}$占位符;

  • bindings绑定参数与invokeFunction方法的第二个参数的区别是,前者是脚本内全局的,而后者是定义在函数内的;

例如把脚本内容定义为这样:

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

执行结果就是这样了:

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

实例化脚本对象并执行


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

运行结果:

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

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

来源:https://www.cnblogs.com/dandelion200/p/14683609.html

0
投稿

猜你喜欢

  • 前言可能会涉及到汇编的知识,不过这没有关系,肯定能看懂,看不懂留言,我再做解释。使用到的工具是vs2010。本节只讲继承的特点,公有私有多态
  • 现象在日志配置文件 logback-spring.xml 中,无论怎么修改级别,mybatis 的 sql 日志都会打印出来。原因在 app
  • 在项目开发中,我们经常需要进行动态添加组件,其中可添加的部分有两项:布局和组件 其中,添加的布局主要有RelativeLayout
  • 发现问题在一个数据列表中我用了Linq GroupBy 和OrderBy。 排序在本机正常使用,发到测试后排序死活不对,总以为是程序问题。于
  • 1、静态函数只能在声明它的文件中可见,其他文件不能引用该函数。2、不同的文件可以使用相同名字的静态函数,互不影响。3、使用static声明的
  • 前言上篇博客我们介绍了如何创建一个spring项目,并且如何的存、取对象,介绍了相关方法,那么本篇博客将接着上篇博客的内容介绍如何更加简单的
  • 1.系统架构包括哪些形式?C/S架构B/S架构2.什么是C/S架构?说白了就是客户端/服务端,我们需要安装特定的客户端软卷,例如:QQ。C/
  • 项目需要用到验证用户手机号码输入是否合法,在网上找了好几处代码,经过测试都是不通过的!最后发现了一段代码可以验证通过。代码好像在一个很多广告
  • Android 中的危险权限详细整理前言:Android 中有上百种权限,现在将所有的权限归为两类:一类是普通权限一类的危险权限普通权限是指
  • 前言: 在命令行中输入可以输入各类参数,本文将针对这些参数做一个小结。基于命令行输入参数测试程序如下:import java.util.Ar
  • 序言springboot框架价值,可以简单快速的构建独立的spring生产级别应用。springboot主要有以下的特性:1.创建独立的Sp
  • 前言:在工作中一次排查慢接口时,查到了一个函数耗时较长,最终定位到是通过 List 去重导致的。由于测试环境还有线上早期数据较少,这个接口的
  • 前言其实很多人都会碰到文本不对齐,文字不对齐的情况,但是只要不明显被提出,一般都会置之不理。我关注这个问题是因为有个老哥问我倒计时的时候,1
  • SmartArt其实就是一个文字的可视化工具,用户可在PowerPoint,Word,Excel中使用该特性创建各种图形图表。SmartAr
  • springBoot Junit测试用例出现@Autowired不生效前提条件:1,测试类上面添加支持的注解就能取到spring中的容器的实
  • 我们都知道现在的语音合成TTS是可以通过微软的SAPI实现的,好处我就不多说了,方便而已,因为在微软的操作系统里面就自带了这个玩意,主要的方
  • 1、properties文件显示乱码问题原因是因为properties默认使用ASCII码,就算在文件中填写了中文,再打开后依然会转换成AS
  • 前文本章是关于Java流程控制语句的最全汇总,本篇为汇总上篇。流程是人们生活中不可或缺的一部分,它表示人们每天都在按照一定的流程做事。比如出
  • 前言公司目前在做一款企业级智能客服系统,对于系统稳定性要求很高,不过难保用户在使用中不会出现问题,而 Android SDK 集成在客户的
  • 对于之前最火的无外乎集五福了,而五福除了加十个好友获得外,最直接的途径就是支付宝的咻一咻了。那么咻一咻具体有哪些实现方式呢?下面我们将一一介
手机版 软件编程 asp之家 www.aspxhome.com