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 . |