Java执行groovy脚本的方法有哪些
Java执行groovy脚本的方法有哪些
这篇文章主要介绍“Java执行groovy脚本的方法有哪些”,在日常操作中,相信很多人在Java执行groovy脚本的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java执行groovy脚本的方法有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
Java
执行groovy
脚本的两种方式:
一种是通过脚本引擎ScriptEngine
提供的eval(String)
方法执行脚本内容;一种是执行groovy
脚本;
二者都通过Invocable
来传递参数并获取执行结果;
Invocable:脚本引擎的解释器接口,提供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脚本的方法有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注高防服务器网网站,小编会继续努力为大家带来更多实用的文章!
[微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。
[图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
[