- PVSM.RU - https://www.pvsm.ru -

Введение в Nashorn

Введение

imageNashorn* — движок JavaScript, разрабатываемый полностью на языке программирования Java компанией Oracle. Основан на Da Vinci Machine [1] (JSR 292) и будет доступен в составе Java 8 (релиз которой ожидается в марте 2014 года). Стоит отметить что выполнение JavaScript (и поддержка сриптинга [2]) была уже в Java 6, но в ней использовался движок Rhino [3], также написанный на Java, но поддерживаемый Mozilla Foundation [4].

О списке нововведений в Java 8 уже писали ранее [5]. В данной статье будет приведена пара простых примеров, которая даст вам представление об использовании Nashorn.

Применение

Зачем нужен JavaScript в Java? Например:

Примеры использования

Подготовительный этап

Устанавливаем JDK 8 Early Access [9]. Далее по тексту подразумевается что команды javac и java выполняются для Java 8.

Hello, World!

import javax.script.*;

public class EvalScript {
    public static void main(String[] args) throws Exception {
        // create a script engine manager
        ScriptEngineManager factory = new ScriptEngineManager();
        // create a Nashorn script engine
        ScriptEngine engine = factory.getEngineByName("nashorn");
        // evaluate JavaScript statement
        try {
            engine.eval("print('Hello, World!');");
        } catch (final ScriptException se) { se.printStackTrace(); }
    }
}

Компилируем класс:

./javac EvalScript.java 

И выполняем его:

./java EvalScript

Видим вывод:

Hello, World!

JavaScript + Java

Nashorn позволяет использовать классы Java [10] для создания программ. Рассмотрим следующий пример:

MyScript.js

var MyClass = Java.type("EvalScript.MyClass");
var my = new MyClass();
my.printMsg("Hello!");

EvalScript.java

import javax.script.*;
import java.io.*;

public class EvalScript {

    public static void main(String[] args) throws Exception {
        // create a script engine manager
        ScriptEngineManager factory = new ScriptEngineManager();
        // create a Nashorn script engine
        ScriptEngine engine = factory.getEngineByName("nashorn");
        // evaluate JavaScript statement
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            engine.eval(br);
        } catch (final ScriptException se) { se.printStackTrace(); }
    }

    public static class MyClass {
        public void printMsg(String msg) {
            System.out.println("printMsg : "+msg);
        }
    }
}

Для примера я создал свой внутренний класс (что не является ограничением, я мог бы создать и отдельный класс), и вызвал его из JavaScript кода. Осталось скомпилировать класс и запустить его передав на вход наш js-код:

./java EvalScript < MyScript.js

Видим вывод:

printMsg : Hello!

Вывод

Решайте сами как использовать такую возможность. Я заинтересовался, когда у меня появилась необходимость внедрить в существующий Java-проект автоматизацию, которую мог бы настраивать не программист, а администратор приложения, прямо через интерфейс приложения (и при этом не требовалась бы перекомпиляция компонент приложения).

Используемые материалы:


* Nashorn — немецкое слово, которое переводится на русский как «носорог», а на английский как «rhinoceros», что перекликается с Rhino [3], названием движка JavaScript, реализованного в Java и поддерживаемого компанией Mozilla Foundation. Rhino, в свою очередь, получил название в честь животного изображённого на обложке книги о JavaScript, выпущенной издательством O'Reilly Media.

Автор: XupyprMV

Источник [14]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/44652

Ссылки в тексте:

[1] Da Vinci Machine: http://en.wikipedia.org/wiki/Da_Vinci_Machine

[2] поддержка сриптинга: http://en.wikipedia.org/wiki/JSR_223

[3] Rhino: http://ru.wikipedia.org/wiki/Rhino

[4] Mozilla Foundation: http://ru.wikipedia.org/wiki/Mozilla_Foundation

[5] писали ранее: http://habrahabr.ru/post/188850/

[6] Использовать совместно с Java FX: http://justmy2bits.com/2013/09/08/javafx-with-nashorn-canvas-example/

[7] Использовать в web-приложениях: http://tech.kinja.com/a-simple-realtime-webapp-using-nashorn-scripting-1059181159

[8] различным образом: https://blogs.oracle.com/nashorn/entry/http_server_written_in_nashorn

[9] JDK 8 Early Access: https://jdk8.java.net/download.html

[10] использовать классы Java: http://download.java.net/jdk8/docs/technotes/guides/scripting/nashorn/api.html#sthref17

[11] http://download.java.net/jdk8/docs/technotes/guides/scripting/nashorn/: http://download.java.net/jdk8/docs/technotes/guides/scripting/nashorn/

[12] http://ru.wikipedia.org/wiki/Nashorn_(движок_JavaScript): http://ru.wikipedia.org/wiki/Nashorn_%28%D0%B4%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA_JavaScript%29

[13] https://blogs.oracle.com/nashorn/: https://blogs.oracle.com/nashorn/

[14] Источник: http://habrahabr.ru/post/195870/