Java中的Nashorn JavaScript引擎和示例

Java中的Nashorn JavaScript引擎和示例

Nashorn :Nashorn是在JDK 8中引入的JavaScript引擎。借助Nashorn,我们可以在Java虚拟机上执行JavaScript代码。Nashorn在JDK 8中引入,以取代现有的JavaScript引擎即Rhino。在性能方面,Nashorn比Rhino要好得多。通过调用动态特性、将JavaScript代码直接转换为字节码加载到内存等功能,使得Nashorn在JDK 8中更加知名。我们可以通过使用命令行工具或将JavaScript代码嵌入到Java源代码中来执行JavaScript代码。

使用控制台执行JavaScript代码: 对于Nashorn引擎,Java 8引入了一个新的命令行工具,即 jjs 。我们需要按照以下步骤通过控制台执行JavaScript代码:

  • 创建一个名为geeks.js的文件。
  • 打开geeks.js并将以下代码写入文件并保存。
var gfg= function(){   
    print("欢迎来到Geeksforgeeks!!!");   
};   
gfg();  
  • 打开命令提示符,输入 jjs geeks.js 并按Enter。它将生成以下输出:
欢迎来到Geeksforgeeks!!!

将JavaScript文件嵌入Java代码以执行JavaScript文件: 我们可以使用 ScriptEngine 类将JavaScript文件嵌入Java代码中并执行JavaScript文件。ScriptEngine类在JDK 6中引入。通过ScriptEngine类,我们可以创建一个JavaScript引擎,并使用该JavaScript引擎执行JavaScript文件。

示例1:

// Program to illustrate embedding 
// of JavaScript file into Java code 
  
import javax.script.*; 
import java.io.*; 
  
public class Geeksforgeeks { 
    public static void main(String[] args) 
        throws Exception 
    { 
  
        // Here we are generating Nashorn JavaScript Engine 
        ScriptEngine ee = new ScriptEngineManager() 
                              .getEngineByName("Nashorn"); 
  
        // Reading JavaScript file create in first approach 
        ee.eval(new FileReader("geeks.js")); 
    } 
} 

输出:

Welcome to Geeksforgeeks!!!

示例 2:

// Program to illustrate embedding 
// of JavaScript code into Java code 
  
import javax.script.*; 
import java.io.*; 
  
public class Geeksforgeeks { 
    public static void main(String[] args) 
        throws Exception 
    { 
  
        // Here we are generating Nashorn JavaScript Engine 
        ScriptEngine ee = new ScriptEngineManager() 
                              .getEngineByName("Nashorn"); 
  
        // Instead of reading JavaScript code from a file. 
        // We can directly paste the JavaScript 
        // code inside Java Code 
        ee.eval("print('Welcome to Geeksforgeeks!!!"
                + " Executing JavaScript code with the"
                + " help of Nashorn engine');"); 
    } 
} 

输出:

欢迎来到Geeksforgeeks!使用Nashorn引擎执行JavaScript代码

除了上述方法,还可以通过Nashorn JavaScript引擎执行多种操作

  1. 从Java代码向JavaScript提供变量 : 假设我们有一个名为geeks.js的JavaScript文件,geeks.js在执行过程中需要一个变量。通过Nashorn的帮助,我们可以从Java代码中传递变量给JavaScript文件。

示例1: geeks.js文件,需要 name 变量才能执行

// JavaScript文件名为geeks.js
print("Welcome to Geeksforgeeks!!! Mr. "+name);   

示例2: Java代码向JS文件提供 name 变量

// 用于展示从Java代码向JavaScript文件传递变量的程序  
import javax.script.*; 
import java.io.*; 
  
public class Geeksforgeeks { 
    public static void main(String[] args) 
        throws Exception 
    { 
        ScriptEngine ee 
            = new ScriptEngineManager() 
                  .getEngineByName("Nashorn"); 
        Bindings bind 
            = ee.getBindings( 
                ScriptContext.ENGINE_SCOPE); 
        bind.put("name", "Bishal Kumar Dubey"); 
        ee.eval(new FileReader("geeks.js")); 
    } 
} 

输出:

Welcome to Geeksforgeeks!!! Mr. Bishal Kumar Dubey
  1. 从Java代码调用JavaScript函数: 我们可以借助Nashorn从Java代码中调用JavaScript函数。假设我们创建了一个名为geeks.js的文件,该文件包含以下两个函数:
// JavaScript文件名为geeks.js
  
var func1 = function(){   
    print("Simple JavaScript function!!!");   
}   
  
var func2 = function(reader){   
    print("Hello "+reader);   
}   
// 用于展示从Java代码调用JavaScript函数的程序  
import javax.script.*; 
import java.io.*; 
  
public class Geeksforgeeks { 
    public static void main(String[] args) 
        throws Exception 
    { 
        ScriptEngine ee 
            = new ScriptEngineManager() 
                  .getEngineByName("Nashorn"); 
        ee.eval(new FileReader("geeks.js")); 
        Invocable invocable = (Invocable)ee; 
  
        // 这里我们调用func1
        invocable.invokeFunction("func1"); 
  
        // 这里我们调用func2
        // 同时传递参数
        invocable.invokeFunction("func2", 
                                 "Bishal Kumar Dubey"); 
    } 
} 

输出:

Simple JavaScript function!!!
Hello Bishal Kumar Dubey

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程