Java GroovyShell-将脚本分成两部分时出错(MissingMethodExceptionNoStack)
我对Groovy完全陌生,所以我希望答案不是显而易见的 假设我有一个脚本“Test.groovy”: 我使用Java GroovyShell-将脚本分成两部分时出错(MissingMethodExceptionNoStack),java,groovy,groovyshell,Java,Groovy,Groovyshell,我对Groovy完全陌生,所以我希望答案不是显而易见的 假设我有一个脚本“Test.groovy”: 我使用GroovyShell(来自Java)评估这个脚本: 我得到了预期的输出: 嘿 现在,我从脚本中删除了最后一行,并在对evaluate()的单独调用中对其进行求值,得到了一个非常模糊的异常 “Test.groovy”: 爪哇: org.codehaus.groovy.runtime.metaclass.MissingMethodExceptionNoStack:方法:A.main()的签名
GroovyShell
(来自Java)评估这个脚本:
我得到了预期的输出:
嘿
现在,我从脚本中删除了最后一行,并在对evaluate()
的单独调用中对其进行求值,得到了一个非常模糊的异常
“Test.groovy”:
爪哇:
org.codehaus.groovy.runtime.metaclass.MissingMethodExceptionNoStack:方法:A.main()的签名不适用于参数类型:([Ljava.lang.String;)值:[[]]
可能的解决方案:wait(),wait(long),any(),find(),wait(long,int),each(groovy.lang.Closure)
更有趣的是,如果我让脚本保持原样,只更改Java部分,它就可以完美地工作(我得到两个“嘿,好了!”)这应该可以帮助解释您看到了什么: 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
方法,但找不到,并抛出了该错误。这应该有助于解释您看到的情况:
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
方法,但找不到,并抛出了该错误
class A {
def greet() {println "Hey there!"}
}
GroovyShell shell = new GroovyShell();
shell.evaluate(new File("Test.groovy"));
shell.evaluate("new A().greet()");
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!')
}
}