加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – GroovyShell:嵌入式执行

发布时间:2020-12-14 19:20:26 所属栏目:Java 来源:网络整理
导读:我正在尝试将groovy嵌入到大型Java应用程序中. Java应用程序应该在启动时加载一些实用程序Groovy脚本. 然后应用程序应该多次运行其他脚本.还需要在GUI处输入一些代码并在用户请求时执行它. 我面临的问题是: 我正在加载启动脚本,如下所示: GroovyShell gShe

我正在尝试将groovy嵌入到大型Java应用程序中.

Java应用程序应该在启动时加载一些实用程序Groovy脚本.

然后应用程序应该多次运行其他脚本.还需要在GUI处输入一些代码并在用户请求时执行它.

我面临的问题是:

我正在加载启动脚本,如下所示:

GroovyShell gShell = new GroovyShell();
gShell.evaluate(new FileReader("scripts/autoload.groovy"));

假设我的autoload.groovy包含:

def prnt(m) {
    println("From Groovy: " + m);
}

这很好用.但是,当我想使用以下命令运行用户命令时:

gShell.evaluate("prnt 66");

我收到错误:
groovy.lang.MissingMethodException:没有方法签名:Script2.prnt()适用于参数类型:(java.lang.Integer)值:[66]

我的用户脚本如何访问已加载的方法?

注意:我也试过“autoload.prnt 88”,仍然得到错误.

最佳答案
每个评估调用都被编译并作为单独的脚本运行,并且

def prnt(m) {
    println("From Groovy: " + m);
}

定义从autoload.groovy生成的Script类中的方法,该方法无法从后续的“调用”脚本访问.但是,由同一GroovyShell运行的脚本共享相同的绑定,因此您可以在一个脚本的绑定中存储值,并在另一个脚本中访问它们.在绑定中存储值只是将值分配给另外未声明的变量:

prnt = { m ->
    println("From Groovy: " + m);
}

这将在绑定变量prnt中存储闭包,您可以从同一shell中的其他脚本调用闭包.注意

def prnt = { m ->

要么

Closure prnt = { m ->

不起作用,因为def或类型使它成为局部变量声明(对这个特定脚本是私有的),而不是对绑定的赋值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读