我是靠谱客的博主 负责滑板,这篇文章主要介绍Java执行groovy脚本的两种方式,现在分享给大家,希望可以做个参考。

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

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

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

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

invokeFunction:

invokeMethod:

以下为案例:

引入依赖

复制代码
1
2
3
4
5
6
<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>1.2.74</version> </dependency>

定义脚本内容并执行

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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方法的第二个参数的区别是,前者是脚本内全局的,而后者是定义在函数内的;

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

执行结果就是这样了:

实例化脚本对象并执行

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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脚本内容:

复制代码
1
2
3
4
5
6
7
8
9
10
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方法的第一个参数是脚本对象,第二个参数是脚本中的函数名称,之后为绑定的参数;

源码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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(); } }

折叠

不正之处,请多多指教~

最后

以上就是负责滑板最近收集整理的关于Java执行groovy脚本的两种方式的全部内容,更多相关Java执行groovy脚本内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部