【问题标题】:GroovyShell: embedded executionGroovyShell:嵌入式执行
【发布时间】:2012-07-21 13:57:45
【问题描述】:

我正在尝试将 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”,但仍然报错。

【问题讨论】:

    标签: java groovy groovyshell


    【解决方案1】:

    每个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 或类型使它成为局部变量声明(此特定脚本专用),而不是对绑定的赋值。

    【讨论】:

      猜你喜欢
      • 2017-07-20
      • 2016-12-06
      • 1970-01-01
      • 2015-01-07
      • 2010-12-09
      • 2014-10-01
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多