2016-11-23 3 views
0

文字列で生成されたコードを実行する必要があるため、Groovyをプログラムで使用しています。 この非常に単純な例では、Groovyのよく知られたエラーに関連する私の問題を示します。 は、Arrays.asList( "A"、 "B"、 "C")は、Arrays.asList( "A"、 "B")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; 
} 

Iは、インラインを2つのリストの使用を渡します。私が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メソッドが呼び出されます。

関連する問題