Delegieren Sie Java-Verarbeitung an JavaScript

Dies ist ein persönliches Memo als Ergebnis der Untersuchung "Kann eine Java-Verarbeitung von außen injiziert werden?"

Methode

Als ich es nachgeschlagen habe, gab es eine JavaScript-Skript-Engine (Nashorn) auf Java, also habe ich versucht, sie zu verwenden. Nashorn kann über das Paket Java SE 8 javax.script aufgerufen werden.

Beispielcode

Dies ist ein Beispielcode, der den Filterprozess von "List" an JavaScript delegiert.

Main.java


public class Main {

    public static void main(String[] args) throws Exception {
	    List<Person> list = Arrays.asList(new Person("a", 1), new Person("b", 2), new Person("c", 3));
        //Delegieren Sie die JavaScript-Filterung
		List<Person> resultList = list.stream().filter(e -> eval(e)).collect(Collectors.toList());
		//Liste vor Filter anzeigen
		System.out.println("Vor dem Filter: " + list);
		//Gefilterte Liste anzeigen
		System.out.println("Nach dem Filtern: " + resultList);
    }

	/**
	 *Bewerten Sie die Ergebnisse der JavaScript-Ausführung
	 * @param person
	 * @return true/false
	 */
	public static boolean eval(Person person) {
    	boolean result = false;
		try {
			ScriptEngineManager manager = new ScriptEngineManager();
			//Erstellen Sie eine JavaScript-Engine
			ScriptEngine engine = manager.getEngineByName("javascript");
			//Setzen Sie ein Objekt auf der Java-Seite auf eine JavaScript-Variable
			engine.put("person", person);
			//Lesen Sie die JavaScript-Datei aus der Datei
			Reader script = new InputStreamReader(Main.class.getResourceAsStream("sample.js"));
			//Führen Sie JavaScript aus
			result = Boolean.valueOf(true).equals(engine.eval(script));
		} catch(ScriptException ex) {
			ex.printStackTrace();
		}
		return result;

	}
}

Ein Java-Objekt, das ein Element in der Liste ist. Wir haben einen "öffentlichen" Getter definiert, damit auf Feldvariablen über JavaScript zugegriffen werden kann.

Person.java


public class Person {
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public Integer getAge() {
        return age;
    }
    public String toString() {
        return "{ name: " + this.name + ", age: " + this.age + "}";
    }
}

Die folgende sample.js verarbeitet die Filtermethode auf der Java-Seite. Ich konnte auch auf die Felder des von Java übergebenen Objekts "person" zugreifen.

sample.js


//Person ist ein Element der Liste, die von der Java-Seite übergeben wird
//Greifen Sie auf das Namensfeld zu und verwenden Sie es in der Beurteilungsformel
person.name === 'a' || person.name === 'b';

Verarbeitungsergebnis

Das Verarbeitungsergebnis des obigen Beispielcodes ist wie folgt. Aus dem Bewertungsergebnis von sample.js können Sie ersehen, dass der Inhalt von List gefiltert wurde.

Vor dem Filter: [{ name: a, age: 1}, { name: b, age: 2}, { name: c, age: 3}]
Nach dem Filtern: [{ name: a, age: 1}, { name: b, age: 2}]

Impressionen

Wenn Sie es wie diesen Fall verwenden, Ich fand es beispielsweise praktisch, eine Liste auf dem Bildschirm zu erstellen, in der der Benutzer die Filterbedingungen jedes Mal ändern kann.

Bemerkungen

Unten ist ein Referenzlink. Grundlagen von Nashorn, JavaScript-Engine auf Java OpenJDK wiki >> Nashorn

Recommended Posts

Delegieren Sie Java-Verarbeitung an JavaScript
Einführung in die funktionale Programmierung (Java, Javascript)
[Verarbeitung × Java] Verwendung von Variablen
Der Weg von JavaScript nach Java
Java Eclips So debuggen Sie JavaScript
[Verarbeitung × Java] Verwendung von Arrays
[Verarbeitung × Java] Verwendung der Schleife
[Verarbeitung × Java] Verwendung der Klasse
[Verarbeitung × Java] Verwendung der Funktion
Java-Thread-Verarbeitung
Java-String-Verarbeitung
[Java] Einführung in Java
Java und JavaScript
Einführung in Java
[Java] Multithread-Verarbeitung
[Java] Stream-Verarbeitung
Java iterativer Prozess
Listenverarbeitung zum Verstehen mit Bildern --java8 stream / javaslang-
[Java] Stellen Sie eine Verbindung zu MySQL her
Kotlins Verbesserungen an Java
Von Java zu Ruby !!
JAVA-Konstruktoraufrufverarbeitung
Einführung in den Java-Befehl
Java zufällig, verschiedene Verarbeitung
[Java] Ich möchte eine asynchrone Verarbeitung mit Promise in der Java-Testversion der Promise-ähnlichen Syntax von JavaScript schreiben.
Verwendung von JSON-Daten in der WebSocket-Kommunikation (Java, JavaScript)
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
Vergleich des Schreibens von Callback-Funktionen (Java, JavaScript, Ruby)
[Verarbeitung × Java] Verwendung von Schleife 2 --- verschachtelte Struktur, Koordinatenkonvertierung
Listenverarbeitung zum Verstehen mit Bildern --java8 stream / javaslang --bonus
Ich habe versucht, JavaScript Part.1 Basic Processing Code System zu berühren
Migration von Cobol nach JAVA
[Java] Verwendung von Map
Java fügt PDF eine Tabelle hinzu
[Java] Multithread-Verarbeitung - Exklusive Steuerung
So deinstallieren Sie Java 8 (Mac)
Java zum Spielen mit Function
Java - So erstellen Sie JTable
Einfach zu erstellende Verarbeitungsbibliothek
Verwendung von Java Optional
Neue Funktionen von Java7 bis Java8
So minimieren Sie Java-Images
Wie schreibe ich einen Java-Kommentar
Verwendung der Java-Klasse
Stellen Sie eine Verbindung von Java zu PostgreSQL her
[Java] Verwendung von removeAll ()
[Java] So zeigen Sie Wingdings an
[Java] Einführung in den Lambda-Ausdruck
Shell zum Beenden von Java-Prozessen
Verwendung von Java Map
[Java] Stream API - Stream-Beendigungsverarbeitung
So legen Sie Java-Konstanten fest
[Java] Stream API - Stream Zwischenverarbeitung
Stellen Sie mit Java eine Verbindung zur Datenbank her
[Java] Implementierungsmethode für die Timer-Verarbeitung
Stellen Sie mit Java eine Verbindung zu MySQL 8 her
[Java] Gründe für die Verwendung von statischen