2017-11-05 4 views
1

Ich verwende Groovy Interpreter in Javaclass, Ich versuche, eine Methode zu definieren und es zu nennen, hier ist mein Code:eine Methode innerhalb Groovy in Java verwendet Definieren

 Binding binding = new Binding(); 
     binding.setVariable("aa", 1); 
     binding.setVariable("bb", 2); 

     GroovyShell shell = new GroovyShell(binding); 
     shell.evaluate("int add(int a,int b){return (a+b)}"); 

     int value =(int) shell.evaluate("add(aa,bb);"); 
     System.out.println(value); 

Und ich habe diesen Fehler habe:

Exception in thread "main" groovy.lang.MissingMethodException: No signature of method: Script2.add() is applicable for argument types: (java.lang.Integer, java.lang.Integer) values: [1, 2] Possible solutions: any(), wait(), run(), run(), find(), wait(long, int)

Bitte sagen Sie mir, wie Sie eine Funktion innerhalb groovy zu definieren und warum mein Code funktioniert nicht.

Mit freundlichen Grüßen,

+0

Was passiert, wenn Sie den gesamten Groovy-Code in eine einzelne Zeichenfolge einfügen und einmal auswerten? Basierend auf dem Klassennamen 'Script2', denke ich, dass die Shell jeden 'evaluate'-Aufruf unabhängig behandelt. – chrylis

+0

@chrylis Du hast Recht, das funktioniert, wenn ich das ganze Skript in einer "Shell" Auswertung auswerte, danke –

Antwort

3

Wenn Sie GroovyShell#evaluate kompiliert die Shell das gesamte Skript in eine JVM-Klasse, lädt sie, und es läuft, dann das Ergebnis zurück. Dieser Prozess ist unabhängig für jeden Aufruf evaluate (beachten Sie, dass der Name der Klasse Script2 ist; die Methode wurde in Script1 definiert) und so ist Ihre Methode in dem zweiten Aufruf nicht verfügbar.

Optionen zur Umgehung dieses Problems sind einfache Stringverkettungen vor der Auswertung (dies funktioniert bei eigenen Skripten, kann aber Probleme verursachen, wenn in den Skripten return aufgerufen wird) oder komplexere GroovyScriptEngine.

+0

Danke das war das Problem, und deine Antwort hilft auch –

Verwandte Themen