2016-11-23 6 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 ("А", "Б"). Когда я вызываю путь функции с встроенными параметрами без привлечения 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 способен выполнять кусок кода внутри строки с функциями, только если эта функция объявлена ​​статическим способом в класс, вызывает вызов метода.

Смежные вопросы