Статьи

Введение в Нашорн

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 .