Java Tutorial

Java Control Statements

Object Oriented Programming

Java Built-in Classes

Java File Handling

Java Error & Exceptions

Java Multithreading

Java Synchronization

Java Networking

Java Collections

Java List Interface

Java Queue Interface

Java Map Interface

Java Set Interface

Java Data Structures

Java Collections Algorithms

Java Miscellaneous

Advanced Java

Java APIs & Frameworks

Java Useful Resources

Java - Nashorn JavaScript Engine



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 JavaScript 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 java methods 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 command line arguments 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 Java variable(s) 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 ('java.math.BigDecimal'). 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
Advertisements