Dies ist ein persönliches Memo als Ergebnis der Untersuchung "Kann eine Java-Verarbeitung von außen injiziert werden?"
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.
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';
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}]
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.
Unten ist ein Referenzlink. Grundlagen von Nashorn, JavaScript-Engine auf Java OpenJDK wiki >> Nashorn
Recommended Posts