我正在尝试将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",但仍然收到错误。
发布于 2012-07-23 18:37:35
每个evaluate调用都作为单独的Script进行编译和运行,并且
def prnt(m) {
println("From Groovy: " + m);
}在从autoload.groovy生成的脚本类中定义一个方法,该方法不能从后续的“调用”脚本访问。但是,由相同GroovyShell运行的脚本共享相同的绑定,因此您可以从一个脚本存储绑定中的值,然后在另一个脚本中访问它们。在绑定中存储值只是将值赋给其他未声明的变量的情况:
prnt = { m ->
println("From Groovy: " + m);
}这会在绑定变量prnt中存储一个闭包,您可以从同一shell中的其他脚本调用该闭包。请注意,
def prnt = { m ->或
Closure prnt = { m ->将不起作用,因为def或类型使其成为局部变量声明(此特定脚本的私有变量),而不是绑定的赋值。
https://stackoverflow.com/questions/11610717
复制相似问题