Войдите в Насхорн
В выпуске 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.
- Импортировать
javax.script
пакет - Создайте объект
ScriptEngineManager
. - Получите объект ScriptEngine из диспетчера, используя метод
getEngineByName()
. Чтобы получить экземпляр двигателя нашорн, передайте «нашорн» - После того, как у вас есть экземпляр движка 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 для получения дополнительной информации.
Удачного кодирования :)