Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GroovyShell-将脚本分成两部分时出错(MissingMethodExceptionNoStack)_Java_Groovy_Groovyshell - Fatal编程技术网

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

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()的签名

我对Groovy完全陌生,所以我希望答案不是显而易见的

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

我使用
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!')
    }

}