gpt4 book ai didi

java - GroovyShell - 将脚本分成两部分时出错 (MissingMethodExceptionNoStack)

转载 作者:行者123 更新时间:2023-11-29 03:06:00 25 4
gpt4 key购买 nike

我是 Groovy 的新手,所以我希望答案不是很明显...

假设我有一个脚本“Test.groovy”:

class A {
def greet() {println "Hey there!"}
}

new A().greet()

然后我使用 GroovyShell(来自 Java)评估这个脚本:

new GroovyShell().evaluate(new File("Test.groovy"));

我得到了预期的输出:

Hey there!

现在,我从脚本中删除了最后一行,而是在对 evaluate() 的单独调用中对其求值,我得到了一个非常模糊的异常。

“测试.groovy”:

class A {
def greet() {println "Hey there!"}
}

Java:

GroovyShell shell = new GroovyShell();
shell.evaluate(new File("Test.groovy"));
shell.evaluate("new A().greet()");

org.codehaus.groovy.runtime.metaclass.MissingMethodExceptionNoStack: No signature of method: A.main() is applicable for argument types: ([Ljava.lang.String;) values: [[]] Possible solutions: wait(), wait(long), any(), find(), wait(long, int), each(groovy.lang.Closure)

更有趣的是,如果我让脚本保持原样并且仅更改 Java 部分,它会完美运行(我收到两个“嘿!”)

最佳答案

这应该有助于解释您所看到的内容:http://www.groovy-lang.org/structure.html#_script_class

Groovy 将您的第一个 .groovy 文件视为脚本,因为最后一行存在于类声明之外。 Groovy 编译成 Java 字节码,而 Java 要求所有代码都定义在一个类中。为了符合要求,Groovy 施展了一些魔法,使用 main 方法将您的脚本动态转换为 Java 类——类似于此:

public class script1440427072752 extends groovy.lang.Script { 

public script1440427072752() {
}

public script1440427072752(groovy.lang.Binding context) {
super(context)
}

public static void main(java.lang.String[] args) {
org.codehaus.groovy.runtime.InvokerHelper.runScript(script1440427072752, args)
}

public java.lang.Object run() {
new A().greet()
}

}
public class A extends java.lang.Object {

public java.lang.Object greet() {
this.println('Hey there!')
}

}

当您删除该行时,Groovy 将您的 .groovy 文件视为一个名为 A 的典型 Java 类。不需要动态转换为 groovy.lang.Script

当您尝试执行 A 时,GroovyShell 寻找 main 方法,找不到,并抛出该错误。

关于java - GroovyShell - 将脚本分成两部分时出错 (MissingMethodExceptionNoStack),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32184130/

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