一招教你使用Java執(zhí)行g(shù)roovy腳本的兩種方式
介紹
記錄 Java
執(zhí)行 groovy
腳本的兩種
一種是通過(guò)腳本引擎 ScriptEngine
提供的 eval(String)
方法執(zhí)行腳本內(nèi)容;一種是執(zhí)行 groovy
腳本;
二者都通過(guò) Invocable
來(lái)傳遞參數(shù)并獲取執(zhí)行結(jié)果;
Invocable:腳本引擎的解釋器接口,提供 invokeFunction
和 invokeMethod
兩種傳遞參數(shù)并獲取執(zhí)行結(jié)果的方法,Java JDK API文檔解釋如下:
invokeFunction:
invokeMethod:
以下為案例:
引入依賴(lài)
<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>1.2.74</version> </dependency>
定義腳本內(nèi)容并執(zhí)行
public void testByFunction(){ // 初始化Bindings Bindings bindings = engine.createBindings(); // 綁定參數(shù) bindings.put("date", new Date()); final String name = "groovy"; // 定義groovy腳本中執(zhí)行方法的名稱(chēng) final String scriptName = "execute"; // 定義groovy腳本內(nèi)容 final String scriptContent = "def " + scriptName +"(name){" + " println(\"now dateTime is: ${date.getTime()}\");" + " println(\"my name is $name\");" + " return date.getTime() > 0;" + "}"; try { // 執(zhí)行腳本 engine.eval(scriptContent, bindings); // 獲取執(zhí)行結(jié)果 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(); } }
運(yùn)行結(jié)果:
invokeFunction
方法的第一個(gè)參數(shù)為腳本的函數(shù)名稱(chēng),把scriptName
拎出來(lái)通過(guò)創(chuàng)建String
對(duì)象再賦值進(jìn)去,方便你看懂函數(shù)名稱(chēng)到底是哪個(gè);scriptContent
中${date.getTime()}
與$name
的意思一樣,grovvy
中的字符串可以識(shí)別${}
和$
占位符;bindings
綁定參數(shù)與invokeFunction
方法的第二個(gè)參數(shù)的區(qū)別是,前者是腳本內(nèi)全局的,而后者是定義在函數(shù)內(nèi)的;
例如把腳本內(nèi)容定義為這樣:
執(zhí)行結(jié)果就是這樣了:
實(shí)例化腳本對(duì)象并執(zhí)行
public void testByMethod(){ try { // 初始化groovy腳本對(duì)象 final TestGroovy testGroovy = new TestGroovy(); // 定義groovy腳本中執(zhí)行方法的名稱(chēng) final String scriptName = "execute"; // 定義參數(shù) final Date arg_1 = new Date(); final String arg_2 = "groovy"; // 執(zhí)行腳本并獲取結(jié)果 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腳本內(nèi)容:
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; } }
運(yùn)行結(jié)果:
invokeMethod
方法的第一個(gè)參數(shù)是腳本對(duì)象,第二個(gè)參數(shù)是腳本中的函數(shù)名稱(chēng),之后為綁定的參數(shù);
源碼:
package com.dandelion.test; import com.dandelion.groovy.TestGroovy; import javax.script.*; import java.util.Date; /** * ================================ * 測(cè)試groovy腳本的執(zhí)行方式 * @Author Him * @Date 2021-04-21 * @Time 01:12 * ================================ */ public class TestScriptEngine { // 查找并創(chuàng)建指定腳本引擎 private ScriptEngine engine = new ScriptEngineManager().getEngineByName("groovy"); public void testByFunction(){ // 初始化Bindings Bindings bindings = engine.createBindings(); // 綁定參數(shù) bindings.put("date", new Date()); // 定義groovy腳本中執(zhí)行方法的名稱(chēng) final String scriptName = "execute"; // 定義groovy腳本內(nèi)容 final String scriptContent = "def " + scriptName +"(){" + " println(\"now dateTime is: ${date.getTime()}\");" + " return date.getTime() > 0;" + "}"; try { // 執(zhí)行腳本 engine.eval(scriptContent, bindings); // 獲取執(zhí)行結(jié)果 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腳本對(duì)象 final TestGroovy testGroovy = new TestGroovy(); // 定義groovy腳本中執(zhí)行方法的名稱(chēng) final String scriptName = "execute"; // 定義參數(shù) final Date arg_1 = new Date(); final String arg_2 = "groovy"; // 執(zhí)行腳本并獲取結(jié)果 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(); } }
到此這篇關(guān)于一招教你使用Java執(zhí)行g(shù)roovy腳本的兩種方式的文章就介紹到這了,更多相關(guān)Java執(zhí)行g(shù)roovy腳本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決maven clean報(bào)錯(cuò):Failed to delete xxxxx\t
這篇文章主要介紹了解決maven clean報(bào)錯(cuò):Failed to delete xxxxx\target\xxxx.jar問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Java基礎(chǔ)入門(mén)篇之邏輯控制練習(xí)題與猜數(shù)字游戲
猜數(shù)字游戲是一款經(jīng)典的游戲,該游戲說(shuō)簡(jiǎn)單也很簡(jiǎn)單,說(shuō)不簡(jiǎn)單確實(shí)也很難,這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)入門(mén)篇之邏輯控制練習(xí)題與猜數(shù)字游戲的相關(guān)資料,需要的朋友可以參考下2023-06-06java POI解析Excel 之?dāng)?shù)據(jù)轉(zhuǎn)換公用方法(推薦)
下面小編就為大家?guī)?lái)一篇java POI解析Excel 之?dāng)?shù)據(jù)轉(zhuǎn)換公用方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08MybatisPlus使用排序查詢(xún)時(shí)將null值放到最后
按照更新時(shí)間排序,但是更新時(shí)間可能為null,因此將null的數(shù)據(jù)放到最后,本文主要介紹了MybatisPlus使用排序查詢(xún)時(shí)將null值放到最后,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08SpringBoot整合Shiro實(shí)現(xiàn)權(quán)限控制的代碼實(shí)現(xiàn)
Apache Shiro是一個(gè)強(qiáng)大且易用的Java安全框架,執(zhí)行身份驗(yàn)證、授權(quán)、密碼和會(huì)話(huà)管理,今天通過(guò)本文給大家介紹SpringBoot整合Shiro實(shí)現(xiàn)權(quán)限控制的方法,感興趣的朋友一起看看吧2021-07-07Springboot swagger配置過(guò)程詳解(idea社區(qū)版2023.1.4+apache-maven-3
這篇文章主要介紹了Springboot-swagger配置(idea社區(qū)版2023.1.4+apache-maven-3.9.3-bin),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07package打包一個(gè)springcloud項(xiàng)目的某個(gè)微服務(wù)報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了package打包一個(gè)springcloud項(xiàng)目的某個(gè)微服務(wù)報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07java設(shè)計(jì)模式原型模式與享元模式調(diào)優(yōu)系統(tǒng)性能詳解
這篇文章主要為大家介紹了java設(shè)計(jì)模式原型模式與享元模式調(diào)優(yōu)系統(tǒng)性能方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05