Déléguer certains traitements Java à JavaScript

Il s'agit d'un mémo personnel à la suite de l'enquête "Un traitement Java peut-il être injecté de l'extérieur?"

Méthode

Quand je l'ai recherché, il y avait un ** moteur de script JavaScript (Nashorn) ** sur Java, alors j'ai essayé de l'utiliser. Nashorn peut être appelé à partir du package Java SE 8 javax.script.

Exemple de code

Ceci est un exemple de code qui délègue le processus de filtrage de List à JavaScript.

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));
        //Déléguer le filtrage JavaScript
		List<Person> resultList = list.stream().filter(e -> eval(e)).collect(Collectors.toList());
		//Afficher la liste avant le filtre
		System.out.println("Avant le filtre: " + list);
		//Afficher la liste filtrée
		System.out.println("Après filtrage: " + resultList);
    }

	/**
	 *Évaluer les résultats d'exécution JavaScript
	 * @param person
	 * @return true/false
	 */
	public static boolean eval(Person person) {
    	boolean result = false;
		try {
			ScriptEngineManager manager = new ScriptEngineManager();
			//Créer un moteur JavaScript
			ScriptEngine engine = manager.getEngineByName("javascript");
			//Définir un objet côté Java sur une variable JavaScript
			engine.put("person", person);
			//Lire le fichier JavaScript à partir du fichier
			Reader script = new InputStreamReader(Main.class.getResourceAsStream("sample.js"));
			//Exécuter JavaScript
			result = Boolean.valueOf(true).equals(engine.eval(script));
		} catch(ScriptException ex) {
			ex.printStackTrace();
		}
		return result;

	}
}

Un objet Java qui est un élément de la liste. Nous avons défini un getter public pour que les variables de champ soient accessibles depuis JavaScript.

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

Le sample.js suivant traite la méthode filter du côté Java. J'ai également pu accéder aux champs de l'objet person passé par Java.

sample.js


//person est un élément de la liste passée du côté Java
//Accédez au champ de nom et utilisez-le dans la formule de jugement
person.name === 'a' || person.name === 'b';

Résultat du traitement

Le résultat du traitement de l'exemple de code ci-dessus est le suivant. À partir du résultat de l'évaluation de sample.js, vous pouvez voir que le contenu de List a été filtré.

Avant le filtre: [{ name: a, age: 1}, { name: b, age: 2}, { name: c, age: 3}]
Après filtrage: [{ name: a, age: 1}, { name: b, age: 2}]

Impressions

Si vous l'utilisez comme ce cas, Par exemple, j'ai trouvé pratique de créer une liste à l'écran où l'utilisateur peut modifier les conditions de filtrage à chaque fois.

Remarques

Ci-dessous un lien de référence. Bases de Nashorn, moteur JavaScript sur Java OpenJDK wiki >> Nashorn

Recommended Posts

Déléguer certains traitements Java à JavaScript
Introduction à la programmation fonctionnelle (Java, Javascript)
[Traitement × Java] Comment utiliser les variables
La route de JavaScript à Java
java Eclips Comment déboguer javaScript
[Traitement × Java] Comment utiliser les tableaux
[Traitement × Java] Comment utiliser la boucle
[Traitement × Java] Comment utiliser la classe
[Traitement × Java] Comment utiliser la fonction
Traitement des threads Java
Traitement des chaînes Java
[Java] Introduction à Java
Java et JavaScript
Introduction à Java
[Java] Traitement multi-thread
[Java] Traitement de flux
traitement itératif java
Traitement des listes à comprendre avec des images - java8 stream / javaslang-
[Java] Connectez-vous à MySQL
Améliorations de Kotlin à Java
De Java à Ruby !!
Traitement des appels du constructeur JAVA
Introduction à la commande java
Java aléatoire, divers traitements
[Java] Je souhaite écrire un traitement asynchrone à l'aide de Promise dans Java-Trial of Promise-like syntax of JavaScript-
Comment utiliser les données JSON dans la communication WebSocket (Java, JavaScript)
Différence entre Java et JavaScript (comment trouver la moyenne)
Comparaison de l'écriture des fonctions de rappel (Java, JavaScript, Ruby)
[Traitement × Java] Comment utiliser la boucle 2 --- structure imbriquée, conversion de coordonnées
Traitement des listes à comprendre avec des images --java8 stream / javaslang --bonus
J'ai essayé de toucher JavaScript Part.1 Système de code de traitement de base
Migration de Cobol vers JAVA
[Java] Comment utiliser Map
Java ajoute un tableau au PDF
[Java] Traitement multi-thread - Contrôle exclusif
Comment désinstaller Java 8 (Mac)
Java pour jouer avec Function
Java - Comment créer JTable
Bibliothèque de traitement facile à créer
Comment utiliser java Facultatif
Nouvelles fonctionnalités de Java7 à Java8
Comment réduire les images Java
Comment rédiger un commentaire java
Comment utiliser la classe Java
Connectez-vous de Java à PostgreSQL
[Java] Comment utiliser removeAll ()
[Java] Comment afficher les Wingdings
[Java] Introduction à l'expression lambda
Shell pour tuer les processus Java
Comment utiliser Java Map
[Java] Stream API - Traitement de l'arrêt du flux
Comment définir des constantes Java
[Java] Stream API - Traitement intermédiaire de flux
Connectez-vous à DB avec Java
[Java] Méthode d'implémentation du traitement du minuteur
Connectez-vous à MySQL 8 avec Java
[java] Raisons d'utiliser statique