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?"
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.
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';
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}]
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.
Ci-dessous un lien de référence. Bases de Nashorn, moteur JavaScript sur Java OpenJDK wiki >> Nashorn
Recommended Posts