gpt4 book ai didi

java - GroovyShell:嵌入式执行

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:28 27 4
gpt4 key购买 nike

我正在尝试将 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:没有方法签名:Script2.prnt() 适用于参数类型:(java.lang.Integer) 值:[66]

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

注意:我也试过“autoload.prnt 88”,还是报错。

最佳答案

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

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

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

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

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

def prnt = { m ->

Closure prnt = { m ->

不会 工作,因为 def 或类型使它成为局部变量声明(对该特定脚本私有(private))而不是对绑定(bind)的赋值。

关于java - GroovyShell:嵌入式执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11610717/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com