2016-11-23 27 views
0

我在我的程序中使用Groovy,因爲我需要運行一些由字符串生成的代碼段。 在這個非常簡單的例子中,我展示了與Groovy中非常着名的錯誤有關的問題。如何處理groovy.lang.MissingMethodException

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( 「A」, 「B」, 「C」),Arrays.asList( 「A」, 「B」)。當我使用內聯參數調用函數路徑而不涉及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) 

我試圖找出爲什麼不工作,以及如何解決它。 有什麼建議嗎?

+0

我不知道如何解決它,但它不工作,因爲腳本不在該類的上下文中執行,而是編譯到它自己的類('Script1')中。 – chrylis

回答

0

我已經解決了這個問題,改變了函數的作用域。似乎是Groovy能夠在函數內部用字符串執行一段代碼,只有當這些函數以靜態方式聲明爲類時纔會調用方法evaluate。