Nashorn JavaScript Engine
Nashorn is a very powerful and performant Javascript Engine in Java. It was introduced in Java 8 to replace the existing javascript engine, Rhino. Nashorn engine is 2 to 10 times faster in performance than it earlier counterpart. It can directly compile the javascript code to the bytcode in memory. It utilizes the dyanamics features introduced in Java 7 to boost performance.
Using Nashorn engine, we can execute code in command line tools. We can embed a javascript code in Java file and call the javascript methods in java code base. We can call in javascript as well using jjs.
Execute JavaScript via Command Line Tools
For Nashorn engine, JAVA 8 introduces a new command line tool, jjs, to execute javascript codes at console. jjs is a versatile tool, it can interpret a javascript file as well as javascript code snippet. We can use jjs to even call java methods in a javascript code.
Example
Interpreting js File
Let”s first try to create and save the file sample.js in c:> JAVA folder. This sample.js file is having a single javascript statement to print “Hello World” on the console using print() method.
sample.js
print(''Hello World!'');
Open console and use the following command. Here jjs will read the sample.js file, interpret the javascript code snippet and execute the code.
C:JAVA>jjs sample.js
It will produce the following output:
Hello World!
Let”s update the sample.js to have a javascript function to be called.
sample.js
function sayMessage(){ print(''Hello World!''); } sayMessage();
Open console and use the following command.
C:JAVA>jjs sample.js
It will produce the following output:
Hello World!
We can evaluate or execute a javascript code snippet using jjs directly as well.
Execute JavaScript Directly in Command Prompt
Open the console and type jjs and press enter button. jjs tool will open an interactive session. Once jjs session is open, we can execute a javascript code. Once done, type quit() and press enter button to exit the jjs interactive session and to return back to the command prompt.
Example
C:JAVA>jjs jjs> print("Hello, World!") Hello, World! jjs> quit() >> C:JAVA>
Passing Arguments to jjs
jjs uses a special construct arguments to store the passed. See the example below:
Open the console and use the following command.
Example
C:JAVA> jjs -- a b c jjs> print(''letters: '' +arguments) letters: a,b,c jjs> quit() >> C:JAVA>
Calling JavaScript from Java
Java has a ScriptEngineManager class since Java 6, which can be used to load the javascript engine as ScriptEngine instance. Once engine is loaded in the java code, we can call eval() method to evaluate a JavaScript code in Java. We can even use in javascript code snippet.
Example
Create the following Java program using any editor of your choice in, say, 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[]) { // create the script engine manager ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); // load the Nashorn javascript engine ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn"); String name = "Mahesh"; Integer result = null; try { // call the javascript function, pass a java variable nashorn.eval("print(''" + name + "'')"); // call the javascript function and get the result back in java result = (Integer) nashorn.eval("10 + 2"); } catch(ScriptException e) { System.out.println("Error executing script: "+ e.getMessage()); } System.out.println(result.toString()); } }
Verify the Result
Compile the class using javac compiler as follows −
C:JAVA>javac Java8Tester.java
Now run the Java8Tester as follows −
C:JAVA>java Java8Tester
It should produce the following result −
Mahesh 12
Calling Java from JavaScript
Using jjs tool, we can even call Java code in a Javascript code snippet. In following example, we”ve created a BigDecimal type first by using Java.type (””). Once BigDecimal class is loaded, we can use its method within JavaScript code as shown below:
Example
Create and save sample.js in c:> JAVA folder.
sample.js
// import BigDecimal java class var BigDecimal = Java.type(''java.math.BigDecimal''); function calculate(amount, percentage) { // use the BigDecimal class instances to showcase BigDecimal calculations 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);
Open the console and use the following command.
C:JAVA>jjs sample.js
It should produce the following output −
78952000000000000003.20