我正在尝试将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”,但仍然收到错误。
答案 0 :(得分:4)
每个evaluate
调用都会编译并作为单独的Script
和
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
或类型使它成为局部变量声明(对此特定脚本是私有的)而不是对绑定的赋值。