Java 8 Nashorn: Движок JavaScript с повышенной производительностью и инструмент jjs
В Java 8 был представлен Nashorn — значительно улучшенный движок JavaScript, заменивший Rhino. Nashorn обеспечивает производительность в 2–10 раз выше, так как компилирует код напрямую в байт-код в памяти и передает его JVM. Для повышения производительности используется механизм invokedynamic, введенный в Java 7.
Инструмент командной строки jjs
Для движка Nashorn в Java 8 появился новый инструмент командной строки — jjs, позволяющий выполнять JavaScript-код в консоли.
Интерпретация JS-файла
Создайте и сохраните файл sample.js в папке C:\JAVA.
sample.js
print('Hello World!');
Откройте консоль и выполните команду:
C:\JAVA>jjs sample.js
Результат:
Hello World!
Интерактивный режим jjs
Запустите интерактивную сессию:
C:\JAVA>jjs
jjs> print("Hello, World!")
Hello, World!
jjs> quit()
>>
Передача аргументов
Аргументы передаются через разделитель --:
C:\JAVA>jjs -- a b c
jjs> print('letters: ' + arguments.join(", "))
letters: a, b, c
jjs>
Вызов JavaScript из Java
С помощью ScriptEngineManager можно выполнять JavaScript-код из Java.
Пример
Создайте Java-программу в папке C:\JAVA.
Java8Tester.java
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
public class Java8Tester {
public static void main(String args[]) {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");
String name = "Mahesh";
Integer result = null;
try {
nashorn.eval("print('" + name + "')");
result = (Integer) nashorn.eval("10 + 2");
} catch (ScriptException e) {
System.out.println("Ошибка выполнения скрипта: " + e.getMessage());
}
System.out.println(result.toString());
}
}
Проверка результата
C:\JAVA>javac Java8Tester.java C:\JAVA>java Java8Tester
Вывод:
Mahesh 12
Вызов Java из JavaScript
Пример импорта и использования Java-классов в JavaScript.
Создайте и сохраните sample.js в C:\JAVA.
sample.js
var BigDecimal = Java.type('java.math.BigDecimal');
function calculate(amount, percentage) {
var result = new BigDecimal(amount).multiply(new BigDecimal(percentage)).divide(
new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_EVEN);
return result.toPlainString();
}
var result = calculate(568000000000000000023, 13.9);
print(result);
Выполните:
C:\JAVA>jjs sample.js
Результат:
78952000000000000003.20
java
- Освоение операторов Java: типы, синтаксис и практические примеры
- Комментарии в Java: типы, использование и лучшие практики
- Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
- Освоение строк в Java: создание, методы и лучшие практики
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Try-with-resources в Java: автоматическое управление ресурсами
- Аннотации в Java: типы, размещение и практические примеры
- Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода
- Понимание Java Vector: использование, особенности и сравнение с ArrayList