Как преобразовать ScriptEngine.eval в объект Java

#javascript #java #nashorn #scriptengine

Вопрос:

Я использую ScriptEngine для запуска Javascript. В моем случае Javascript всегда будет возвращать логическое значение. Я думал, что eval() вернет объект, который я могу привести, но вместо этого он, похоже, возвращает a ScriptObjectMirror . Функция toString() возвращает [Boolean true] значение , поэтому оценка работает. Как я могу преобразовать или привести к логическому или логическому значению?

Вот мой код

 final ScriptEngineManager manager = new ScriptEngineManager();
final ScriptEngine engine = manager.getEngineByName("javascript");
final Object jsEval = engine.eval(String.format("new Boolean(%s)", jsString));
System.out.printf("*** jsEval: %s %s%n ", jsEval, jsEval.getClass().getName());
 

Выход есть

 *** jsEval: [Boolean true] jdk.nashorn.api.scripting.ScriptObjectMirror
 

Ответ №1:

Если вы точно знаете тип, вы можете использовать to метод:

 jsEval.to(Boolean.class)
 

Комментарии:

1. Спасибо. Люблю, когда это такое простое решение. Очевидно, мне нужно бросить в ScriptObjectMirror. Почему eval() возвращает объект вместо возврата ScriptObjectMirror или, по крайней мере, какого-либо интерфейса

2. Без понятия. Имейте в виду, что Nashorn устарел с Java-11 и удален с Java15.

3. К сожалению, я все еще на Java 8 :-(. Я предполагаю, что есть замена? Так как я использую final ScriptEngine engine = manager.getEngineByName("javascript"); , я предполагаю, что он будет использовать любой рекомендуемый в настоящее время движок