JavaFX z Arią - powrót do strony głównej

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;
}