📜  带有示例的Java中的 Nashorn JavaScript 引擎

📅  最后修改于: 2022-05-13 01:55:45.896000             🧑  作者: Mango

带有示例的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 引入了一种新的命令行工具,即jjl 。我们必须按照以下步骤通过控制台执行 JavaScript 代码:

  • 创建一个名为 geeks.js 的文件。
  • 打开 geeks.js 并将以下代码写入文件并保存。
    var gfg= function(){  
        print("Welcome to Geeksforgeeks!!!");  
    };  
    gfg(); 
    
  • 打开 CMD,写jjl geeks.js然后回车。它将生成以下输出:
    Welcome to 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');");
    }
}

输出:

除此之外,在 Nashorn JavaScript Engine 的帮助下,我们可以执行多个操作,例如

  1. 从Java代码提供 JavaScript 变量:假设我们有一个带有 geeks.js 的 JavaScript 文件名,而 geeks.js 在执行期间需要一个变量。在 Nashorn 的帮助下,我们可以将变量从Java代码传递到 JavaScript 文件。

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

    // JavaScript file name with geeks.js
    print("Welcome to Geeksforgeeks!!! Mr. "+name);  
    

    示例 2:为 JS 文件提供名称变量的Java代码

    // Program to illustrate passing of variable
    // from java code to javascript file
      
    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
    
  2. 从Java代码调用 JavaScript函数:我们可以借助 Nashorn 从Java代码调用 JavaScript函数。假设我们用 geeks.js 创建一个文件名,该文件包含两个函数,如下所示:
    // JavaScript file name with geeks.js
      
    var func1 = function(){  
        print("Simple JavaScript function!!!");  
    }  
      
    var func2 = function(reader){  
        print("Hello "+reader);  
    }  
    
    // Program to illustrate calling of
    // JavaScript function from Java code
      
    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;
      
            // Here we are calling func1
            invocable.invokeFunction("func1");
      
            // Here we are calling func2
            // as well as passing argument
            invocable.invokeFunction("func2",
                                     "Bishal Kumar Dubey");
        }
    }
    

    输出:

    Simple JavaScript function!!!
    Hello Bishal Kumar Dubey