如何处理groovy.lang.MissingMethodException

时间:2016-11-23 00:59:43

标签: java groovy

我在我的程序中使用Groovy因为我需要运行一些由string生成的代码。 在这个非常简单的例子中,我展示了与Groovy中一个众所周知的错误相关的问题。

public static void main(String[] args) {
    Binding binding = new Binding();
    GroovyShell shell = new GroovyShell(binding);
    path(Arrays.asList("A", "B", "C"), Arrays.asList("A", "B"));
    String s = "path(Arrays.asList(\"A\", \"B\", \"C\"), Arrays.asList(\"A\", \"B\"))"; 
    Object value = shell.evaluate(s);
}

private static List<String> path(List<String> dstString, List<String> srcString) {
    System.out.println("it works!");
    return dstString;
}

我使用以下内容传递内联两个列表: Arrays.asList(&#34; A&#34;,&#34; B&#34;,&#34; C&#34;),Arrays.asList( &#34; A&#34;,&#34; B&#34;)。当我使用内联参数调用函数路径而不涉及Groovy时,它可以工作。 但是,当我使用Groovy完全相同时,它会失败并返回以下错误:

Exception in thread "main" groovy.lang.MissingMethodException: No signature        of method: Script1.path() is applicable for argument types: (java.util.Arrays$ArrayList, java.util.Arrays$ArrayList) values: [[A, B, C], [A, B]]
 Possible solutions: wait(), any(), with(groovy.lang.Closure),    each(groovy.lang.Closure), run(), run()
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:58)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:81)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:174)
at Script1.run(Script1.groovy:1)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:585)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:623)
at groovy.lang.GroovyShell.evaluate(GroovyShell.java:594)
at Test.main(Test.java:16)

我试图弄清楚为什么不工作以及如何解决它。 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题,改变了这个功能的范围。似乎是Groovy能够用函数在字符串中执行一段代码,只有当这些函数以静态方式声明到类中时才调用方法evaluate。