5

我正在尝试将 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: No signature of method: Script2.prnt() is applicable for argument types: (java.lang.Integer) values: [66]

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

注意:我也尝试过“autoload.prnt 88”,但仍然出现错误。

4

1 回答 1

4

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

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

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

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

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

def prnt = { m ->

或者

Closure prnt = { m ->

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

于 2012-07-23T10:37:35.417 回答