首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GroovyShell:嵌入式执行

GroovyShell:嵌入式执行
EN

Stack Overflow用户
提问于 2012-07-23 18:26:31
回答 1查看 1.4K关注 0票数 5

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

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

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

我面临的问题是:

我像这样加载启动脚本:

代码语言:javascript
复制
GroovyShell gShell = new GroovyShell();
gShell.evaluate(new FileReader("scripts/autoload.groovy"));

假设我的autoload.groovy包含:

代码语言:javascript
复制
def prnt(m) {
    println("From Groovy: " + m);
}

这可以很好地工作。但是当我想使用以下命令运行用户命令时:

代码语言:javascript
复制
gShell.evaluate("prnt 66");

我得到了错误:groovy.lang.MissingMethodException: No signature of method: Script2.prnt() is applicable for argument types: (java.lang.Integer) values: [66]

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

注:我也尝试过"autoload.prnt 88",但仍然收到错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-23 18:37:35

每个evaluate调用都作为单独的Script进行编译和运行,并且

代码语言:javascript
复制
def prnt(m) {
    println("From Groovy: " + m);
}

在从autoload.groovy生成的脚本类中定义一个方法,该方法不能从后续的“调用”脚本访问。但是,由相同GroovyShell运行的脚本共享相同的绑定,因此您可以从一个脚本存储绑定中的值,然后在另一个脚本中访问它们。在绑定中存储值只是将值赋给其他未声明的变量的情况:

代码语言:javascript
复制
prnt = { m ->
    println("From Groovy: " + m);
}

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

代码语言:javascript
复制
def prnt = { m ->

代码语言:javascript
复制
Closure prnt = { m ->

将不起作用,因为def或类型使其成为局部变量声明(此特定脚本的私有变量),而不是绑定的赋值。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11610717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档