Pull to refresh

Введение в Nashorn

Reading time3 min
Views35K

Введение


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

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


Применение


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


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


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

Устанавливаем JDK 8 Early Access. Далее по тексту подразумевается что команды 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 для создания программ. Рассмотрим следующий пример:

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, названием движка JavaScript, реализованного в Java и поддерживаемого компанией Mozilla Foundation. Rhino, в свою очередь, получил название в честь животного изображённого на обложке книги о JavaScript, выпущенной издательством O'Reilly Media.
Tags:
Hubs:
Total votes 17: ↑14 and ↓3+11
Comments28

Articles