Aym*_*man 5 java groovy groovyshell
我正在尝试将groovy嵌入到大型Java应用程序中.
Java应用程序应该在启动时加载一些实用程序Groovy脚本.
然后应用程序应该多次运行其他脚本.还需要在GUI处输入一些代码并在用户请求时执行它.
我面临的问题是:
我正在加载启动脚本,如下所示:
GroovyShell gShell = new GroovyShell();
gShell.evaluate(new FileReader("scripts/autoload.groovy"));
Run Code Online (Sandbox Code Playgroud)
假设我的autoload.groovy包含:
def prnt(m) {
println("From Groovy: " + m);
}
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,当我想使用以下命令运行用户命令时:
gShell.evaluate("prnt 66");
Run Code Online (Sandbox Code Playgroud)
我收到错误:
groovy.lang.MissingMethodException: No signature of method: Script2.prnt() is applicable for argument types: (java.lang.Integer) values: [66]
我的用户脚本如何访问已加载的方法?
注意:我也试过"autoload.prnt 88",仍然得到错误.
每个evaluate调用都作为单独的编译和运行Script,并且
def prnt(m) {
println("From Groovy: " + m);
}
Run Code Online (Sandbox Code Playgroud)
在从 生成的 Script 类中定义一个方法autoload.groovy,该方法无法从后续“调用”脚本中访问。但是,同一脚本运行的脚本GroovyShell共享相同的绑定,因此您可以在一个脚本的绑定中存储值并在另一个脚本中访问它们。在绑定中存储值只是将该值分配给未声明的变量的一种情况:
prnt = { m ->
println("From Groovy: " + m);
}
Run Code Online (Sandbox Code Playgroud)
这会在绑定变量中存储一个闭包prnt,您可以从同一 shell 中的其他脚本调用该闭包。注意
def prnt = { m ->
Run Code Online (Sandbox Code Playgroud)
或者
Closure prnt = { m ->
Run Code Online (Sandbox Code Playgroud)
不起作用,因为or 类型使其成为局部变量声明(此特定脚本私有)而不是对绑定的def赋值。
| 归档时间: |
|
| 查看次数: |
1308 次 |
| 最近记录: |