Java 8 представила и новый движок JavaScript под названием «Nashorn». Nashorn основан на Da Vinci Machine, проекте с целью добавления поддержки динамического языка в JVM. Nashorn — хорошая веха в том, чтобы сделать гибридные программы проще, чем раньше. Приятные функции этого движка позволяют вам осуществлять полнодуплексную связь между вашими кодами java (любые другие скомпилированные языки) и javascript.
Самым простым способом использования Nashorn является инструмент командной строки, который входит в комплект JDK 8 или OpenJDK 8, и его можно найти в «/ bin». при выполнении jjs вы столкнетесь с подсказкой jjs о том, что вы можете работать с Nashorn в интерактивном режиме, а также вы можете передавать js-файлы в качестве аргументов jjs. Вы можете найти базовый пример использования jjs ниже:
Рассмотрим следующий файл simple.js:
|
1
2
|
var name="Nashorn";print(name); |
Теперь, позвонив: jjs simple.js, на экране появится текст «Нашорн».
Я думаю, что jjs достаточно для ознакомления, если вам нужна дополнительная информация, вы можете ввести jjs -help.
Также вы можете использовать скриптовый движок Nashorn в вашем Java-коде. Рассмотрим следующий файл Program.java:
|
1
2
3
4
5
6
7
8
|
public class Program { public static void main(String... args) throws ScriptException { ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine nashornEngine = factory.getEngineByName("nashorn"); nashornEngine.eval("print('hello world');"); }} |
С помощью этого простого кода на вашем экране появится очень хороший мир приветствия. Также вы можете оценивать js-файлы в вашем скриптовом движке, интерфейсы ScriptEngine имеют перегрузку метода eval с типом абстрактного класса Reader. Таким образом, вы можете просто передавать любые объекты, которые являются экземплярами класса Reader. Рассмотрим следующий код:
содержание script1.js:
|
1
2
3
4
5
|
var version = 1; function hello(name) { return "hello " + name;} |
Содержание Program.java:
|
01
02
03
04
05
06
07
08
09
10
11
12
|
public class Program { public static void main(String... args) throws ScriptException, NoSuchMethodException { ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine nashornEngine = factory.getEngineByName("nashorn"); nashornEngine.eval(new InputStreamReader(Program.class.getResourceAsStream("script1.js"))); System.out.println(nashornEngine.get("version")); Invocable invocable = (Invocable) nashornEngine; Object result = invocable.invokeFunction("hello", "soroosh"); System.out.println(result);}} |
Интерфейс ScriptEngine имеет метод get. Как вы заметили в примере, вы можете вызывать его для получения любых переменных или любых состояний, определенных в вашем ScriptEngine. В приведенном выше примере «версия» — это переменная, объявленная в файле simple.js.
Каждый механизм сценариев имеет свою собственную реализацию класса ScriptEngine, и есть несколько дополнительных интерфейсов, которые могут реализовывать механизмы сценариев для расширения их функциональности. Если вы проверите исходный код NashornSriptEngine, подпись класса:
|
1
|
public final class NashornScriptEngine extends javax.script.AbstractScriptEngine implements javax.script.Compilable, javax.script.Invocable |
Таким образом, механизм сценариев Nashorn позволяет вам использовать и эти два интерфейса. В приведенном выше примере для вызова функций, которые объявлены в нашем скриптовом движке, мы использовали интерфейс Invocable.
Примечание: ScriptEngine имеет состояние, поэтому если вы вызываете некоторые функции или вызываете некоторые коды в вашем скриптовом движке, состояние объектов и переменных может повлиять на их результат.
Вывод:
В этой статье я попытался представить Nashorn очень простым и практичным способом. В следующих статьях я продемонстрирую совместимость Java + Nashorn и ее использование в реальном мире.
| Ссылка: | Введение в Nashorn от нашего партнера JCG Сороша Сарабадани в блоге Just Another Java . |