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