Wywoływanie funkcji
Skrypt wykonywany jest w całości. Jeżeli silnik skryptu implementuje interfejs Invocable
– co zależy od twórców skryptu – każda funkcja ze skryptu może być wywołana oddzielnie.
Klasa E13-InvokeFunction.java
package jsr223groovy; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import java.io.IOException; import java.io.Reader; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class E13_InvokeFunction { public static void main(String[] args) { String fileName = "src/scripts/skrypt4.groovy"; Path path = Paths.get(fileName); if (! Files.exists(path) ) { System.out.println(path.toAbsolutePath() + " nie istnieje."); return; } ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine se = sem.getEngineByName("Groovy"); if (!(se instanceof Invocable inv)) { System.out.println("Wywoływanie funkcji nie jest dostępne."); return; } try { Reader reader = Files.newBufferedReader(path); se.eval(reader); Object result = inv.invokeFunction("dividing", 127, 3); System.out.println("dividing(127, 3) = [" + ((int[])result)[0] + ", " + ((int[])result)[1] + "]"); } catch (ScriptException | NoSuchMethodException | IOException e) { e.printStackTrace(); } } }
Skrypt skrypt4.groovy
package scripts a = 125 b = 3 def dividing(int a, int b){ def a1 = a.intdiv(b) def a2 = a % b def res = [a1, a2] as int[] return res; } result = dividing(a,b) println("dividing($a, $b) = $result")
Po uruchomieniu klasy na konsoli zobaczymy:
dividing(125, 3) = [41, 2] dividing(127, 3) = [42, 1]
Klasa module-info.java
module jsr223groovy { requires org.apache.groovy; requires java.scripting; requires java.sql; exports jsr223groovy; opens jsr223groovy; }