介绍Nashorn JavaScript引擎

Nashorn是Oracle用Java编程语言开发的一种新的JavaScript引擎,随Java 8一起发布。Nashorn的目标是在Java中使用本机JVM实现轻量级高性能JavaScript运行时。 通过使用Nashorn,开发人员可以将JavaScript嵌入Java应用程序中,还可以从JavaScript代码中调用Java方法和类。

为什么离开犀牛?

犀牛是Nashorn的前身。 它始于1997年在NetScape的一个项目,并于1998年发布。

自Rhino发布以来已经有16年了,JavaScript引擎一直活着。 因此,Java专家们决定从头开始开发新的JavaScript引擎,而不是重写现有的JavaScript引擎,从而从中获得一些乐趣。 这催生了纳索恩(有趣的事实:纳索恩在德语中是犀牛的意思)。

这里几乎每个人都在浏览器中使用JavaScript,有些人在服务器上使用了JavaScript(例如Node.js),但是Nashorn的开发目的是为了实现其他目的。 通过使用Nashorn,开发人员可以执行以下操作:

  • 将JavaScript作为本机桌面代码运行。
  • 使用JavaScript编写外壳脚本。
  • 从JavaScript代码调用Java类和方法。

纳斯霍恩的目标

在设计Nashorn时,开发人员为此制定了一系列目标:

  • 它应基于ECMAScript-262版本5.1语言规范,并且必须通过ECMAScript-262兼容性测试。
  • 它应该支持javax.script (JSR 223)API。
  • 它应该允许从JavaScript调用Java,反之亦然。
  • 它应该定义一个命令行工具jjs用于评估“ shebang”脚本(通常以#!/bin/sh开头)中的JavaScript代码,在此提供文档并编辑字符串。
  • 其性能应明显优于Rhino。
  • 它应该没有安全风险。

此外,没有人确定Nashorn将不包括调试功能,也不支持CSS和JavaScript库/框架。 这意味着Nashorn可以在浏览器中实现,而不必做噩梦。

(nut)Shell中的JavaScript

为了通过使用Nashorn的jjs工具在外壳中使用JavaScript,您应该首先安装JDK8 ,可以免费下载。 要测试其安装,执行:

>_ javac -version
# it should echo
# java version "1.8.x"
jjs -version
# it should echo
# nashorn 1.8.x
jjs>

如果您在使用第一个或第二个命令时遇到任何问题,请尝试在路径中添加JDK

现在,您可以将JavaScript用作Shell脚本。 看看这个简单的例子:

jjs> var a = 1
jjs> var b = 4
jjs> print (a+b)
5
jjs>

正如您可能已经知道的那样,您不必将代码编写到jjs shell中。 您可以将代码写入JavaScript源文件,然后从外壳程序中调用它。 考虑以下JavaScript代码:

var isPrime = function(num) {
    if (isNaN(num) || !isFinite(num) || num < 2) 
        return false;

    var m = Math.sqrt(num);

    for (var i = 2;i <= m; i++) 
        if (num % i === 0) 
            return false;

    return true;
}

var numbers = [ 2, 3, 4, 5, 6, 7, 8, 9, 10 ];

for (var i = 0; i < numbers.length; i++) {
    if (isPrime(numbers[i]))
        print(numbers[i] + " is prime");
    else
        print(numbers[i] + " is not prime");
}

假设代码在名为prime.js的文件中,我们可以通过执行以下命令在shell中运行它:

>_ jjs prime.js
2 is prime
3 is prime
4 is not prime
5 is prime
6 is not prime
7 is prime
8 is not prime
9 is not prime
10 is not prime

这可能使您想起Python代码或bash脚本,但这是JavaScript。 为了使它更像bash,Nashorn提供了arguments变量以提取命令行参数。 考虑以下示例:

if (arguments.length === 0)
    print("No command-line arguments.");
else {
    print("Called with these command-line arguments:");

    for each (cli_arg in arguments) {
        print(cli_arg);
    }
}

运行它会得到以下输出(参数在--之后):

>_ jjs cliargs.js
No command-line arguments.

>_ jjs cliargs.js -- a b "c d e"
Called with these command-line arguments:
a
b
c d e

而且,JavaScript可以使用Java类和方法。 请参见以下多线程JavaScript代码示例:

var Thread = Java.type("java.lang.Thread"); 
var Runnable = Java.type('java.lang.Runnable');

var Run1 = Java.extend(Runnable, { 
    run: function() { 
        print("One thread");
        print("One thread");
    } 
}); 

new Thread(function() {
    print("Another thread");
    print("Another thread");
    print("Another thread");
}).start()

new Thread(new Run1()).start();

输出将是:

Another thread
Another thread
One thread
One thread
Another thread

您可以从输出中看出代码是多线程的。 通过使用Java.type("java.lang.Thread"); 我们可以在JavaScript代码中调用Java类。 Nashorn甚至允许在另一个方向上调用Java代码中的JavaScript代码。

package j2js.example;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Main {

    public static void main(String[] args) {

        ScriptEngine nashorn = new ScriptEngineManager().getEngineByName("nashorn");
        
        try {
            nashorn.eval("print('Am I Java or JavaScript?')");
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

}

此示例仅打印Am I Java or JavaScript? 第14行的问题,但这是Java中最简单的JavaScript代码示例。 可以使用Java方法从JavaScript文件中读取整个源代码,然后将该代码作为String参数传递给eval()方法。 这将使JavaScript代码在Java内部执行。

结论

如今,JavaScript无处不在! 您可以将其用于客户端应用程序,服务器端应用程序,甚至可以用于客户端和服务器 。 您可以将其用于移动应用程序或建立小型IoT 。 现在,借助Nashorn,您可以利用JavaScript的简单性和Java丰富的API将其用作功能强大的类似于shell的脚本语言。

From: https://www.sitepoint.com/introducing-nashorn-javascript-engine/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nashorn是JDK 1.8中提供的一个JavaScript引擎,它可以让Java程序直接运行JavaScript代码。下面是使用Nashorn JavaScript引擎的详细步骤: 1. 导入Nashorn库 在Java代码中导入Nashorn库。在Java 8中,Nashorn库已经默认包含在JDK中,因此不需要额外下载和导入。 2. 创建一个Nashorn引擎 通过调用ScriptEngineManager类的getEngineByName()方法并传入“nashorn”作为参数,可以创建一个Nashorn引擎。例如: ``` ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); ``` 3. 执行JavaScript代码 可以通过以下方式执行JavaScript代码: - 从一个文件中读取JavaScript代码并执行: ``` engine.eval(new FileReader("file.js")); ``` - 直接执行字符串中的JavaScript代码: ``` engine.eval("print('Hello, world!')"); ``` 4. 在JavaJavaScript之间传递变量 可以通过Bindings对象在JavaJavaScript之间传递变量。Bindings对象充当了一个映射表,可以将Java变量映射到JavaScript变量,也可以将JavaScript变量映射到Java变量。例如: ``` Bindings bindings = engine.createBindings(); bindings.put("message", "Hello, world!"); engine.eval("print(message)", bindings); ``` 在这个例子中,创建了一个Bindings对象,并将一个名为“message”的字符串变量绑定到它上面。然后,将这个Bindings对象传递给eval()方法,以便在JavaScript代码中使用该变量。 5. 调用JavaScript函数 可以使用ScriptEngine的get()方法获得一个函数对象,并使用函数对象的call()方法调用JavaScript函数。例如: ``` engine.eval("function add(a, b) { return a + b; }"); Invocable invocable = (Invocable) engine; Object result = invocable.invokeFunction("add", 1, 2); System.out.println(result); // 输出3 ``` 在这个例子中,通过eval()方法定义了一个名为“add”的JavaScript函数。然后,通过调用invokeFunction()方法调用了这个函数,并传递了两个参数。最后,将函数返回的结果打印到控制台上。 希望这些步骤能帮助你了解如何使用Nashorn JavaScript引擎

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值