Войдите в Насхорн

В выпуске Java 8 появилось множество новых функций, в том числе совершенно новый движок JavaScript для замены существующего Rhino. Nashorn действительно необходим, когда вы хотите смешивать и сопоставлять коды Java и JavaScript. Используя nashorn, вы можете вызывать функции JavaScript из своего Java-кода и вызывать Java-код из JavaScript. Итак, JavaScript отлично справился с Java 8 с помощью nashorn.

Если вы не сталкивались с Nashorn, просто попробуйте, потому что он поддерживает только JDK 8–10.

В этом сообщении в блоге я в основном подчеркиваю красоту функции load () в nashorn. Просмотрите примеры кода, чтобы легко понять это. Образец можно получить здесь.

Вызов Nashorn из кода Java

Давайте вызовем эту функцию JavaScript из кода Java.

var function1 = function(name){
    print("Hello "+name);
    return "Greetings from JavaScript";
}

Пример кода Java находится здесь.

ScriptEngine engine = newScriptEngineManager().getEngineByName("nashorn");
    engine.eval(new FileReader("script.js"));

    Invocable invocable = (Invocable) engine;

    Object result = invocable.invokeFunction("function1", "Anuradha");
    System.out.println(result);
}

Чтобы вызвать Nashorn в вашем Java-приложении, создайте экземпляр движка Nashorn, используя Java Scripting API.

  1. Импортировать javax.script пакет
  2. Создайте объект ScriptEngineManager.
  3. Получите объект ScriptEngine из диспетчера, используя метод getEngineByName(). Чтобы получить экземпляр двигателя нашорн, передайте «нашорн»
  4. После того, как у вас есть экземпляр движка Nashorn, вы можете использовать его для оценки файла или оператора сценария.

Вместо оценки файла сценария вы можете оценить указанную выше функцию с помощью следующего оператора.

engine.eval("var function1 = function(name){\n" +
        "    print(\"Hello \"+name);\n" +
        "    return \"Greetings from JavaScript\";\n" +
        "}");

Чтобы вызвать функцию JavaScript, сначала вы должны привести механизм сценария к Invocable. Интерфейс Invocable реализован реализацией NashornScriptEngine и определяет метод invokeFunction для вызова функции javascript для заданного имени.

Ваш вывод будет:

Hello Anuradha
Greetings from JavaScript

Загрузка скриптов

Функция load () в nashorn загружает и оценивает сценарий на основе пути, URL-адреса или объекта сценария.

Давай попробуем все три варианта.

создайте файл JavaScript как lib.js и напишите там эту функцию.

function increment(number){
    number=number+1;
    return number;
}

Создайте файл JavaScript как math.js и напишите следующее.

load('lib.js');

var function2 =function (number) {
    return increment(number);

}

Вызов function2 из кода Java.

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");

    engine.eval(new FileReader("math.js"));

    Invocable invocable = (Invocable) engine;

    Object result = invocable.invokeFunction("function2", 50);
    System.out.println(result);
}

Результат:

51.0

Затем попробуйте загрузить функцию в lib.js как объект сценария. Вместо строки load(‘lib.js’); в файле math.js напишите следующее.

load({"name":"lib.js","script":"function increment(number){number=number+1;return number;}"});

Имя объекта сценария может быть любым.

Если вы разместили lib.js или у вас есть другой способ доступа к файлу lib.js по URL-адресу, можно использовать load("<URL>"); . Вы можете протестировать это, разместив файл здесь. Вы можете использовать load("http://yourjavascript.com/110181462191/lib.js"); для загрузки lib.js в качестве URL-адреса.

Оценить функцию загрузки внутри кода Java

Вместо того, чтобы писать функцию load () поверх другого файла JavaScript, вы можете заранее загрузить и оценить требуемый файл, объект скрипта или URL из того же экземпляра движка nashorn.

Как путь к файлу:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
String filepath= "lib.js";
engine.eval("load('"+filepath+"')");

engine.eval(new FileReader("math.js"));

Invocable invocable = (Invocable) engine;

Object result = invocable.invokeFunction("function2", 50);
System.out.println(result);

Как объект скрипта:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");

String scriptObject ="{\"name\":\"lib.js\",\"script\":\"function increment(number){number=number+1;return number;}\"}";
engine.eval("load("+scriptObject+")");


engine.eval(new FileReader("math.js"));

Invocable invocable = (Invocable) engine;

Object result = invocable.invokeFunction("function2", 50);
System.out.println(result);

В виде URL:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");

String url = "http://yourjavascript.com/110181462191/lib.js";
engine.eval("load('"+url+"')");


engine.eval(new FileReader("math.js"));

Invocable invocable = (Invocable) engine;

Object result = invocable.invokeFunction("function2", 50);
System.out.println(result);

В nashorn есть так много других функций. Следуйте руководству пользователя Nashorn https://docs.oracle.com/javase/9/nashorn/JSNUG.pdf для получения дополнительной информации.

Удачного кодирования :)