目录
什么是Nashorn JavaScript引擎?
Nashorn与其他JavaScript引擎相比如何?
如何在我的Java应用程序中使用Nashorn?
使用Nashorn的好处是什么?
Oracle是否仍在维护Nashorn?
Nashorn的一些替代方案是什么?
我可以在Nashorn中使用ES6功能吗?
如何调试Nashorn执行的JavaScript代码?
我可以在Nashorn中使用Node.js模块吗?
如何从Nashorn执行的JavaScript代码调用Java方法?
首页 web前端 js教程 介绍Nashorn JavaScript引擎

介绍Nashorn JavaScript引擎

Feb 21, 2025 am 10:21 AM

Introducing the Nashorn JavaScript Engine

Oracle在Java编程语言中开发了一个名为Nashorn的新型JavaScript引擎,并随Java 8一起发布。Nashorn的目标是在Java中实现一个轻量级高性能的JavaScript运行时环境,并使用原生JVM。通过使用Nashorn,开发人员可以在Java应用程序中嵌入JavaScript,并从JavaScript代码调用Java方法和类。

核心要点

  • Nashorn是由Oracle使用Java开发的高性能JavaScript引擎,旨在在Java中实现轻量级的JavaScript运行时环境,并使用原生JVM。它允许开发人员在Java应用程序中嵌入JavaScript,并从JavaScript代码调用Java方法和类。
  • Nashorn的设计目标包括:基于ECMAScript-262第5.1版语言规范;支持javax.script(JSR 223)API;允许从JavaScript调用Java,反之亦然;定义一个命令行工具来评估JavaScript代码;性能优于其前身Rhino。
  • 使用Nashorn,JavaScript可以用作功能强大的shell式脚本语言,利用JavaScript的简洁性和Java丰富的API。它可用于客户端应用程序、服务器端应用程序、移动应用程序或小型物联网(IoT)的设置。

为什么放弃Rhino?

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

Rhino发布至今已有16年,这个JavaScript引擎已经完成了它的使命。因此,Java团队决定从头开始开发一个新的JavaScript引擎,而不是重写现有的引擎。这催生了Nashorn(有趣的是,nashorn在德语中是犀牛的意思)。

几乎每个人都在浏览器中使用JavaScript,有些人也在服务器上使用它(例如Node.js),但Nashorn的开发目的不同。通过使用Nashorn,开发人员可以实现以下功能:

  • 将JavaScript作为原生桌面代码运行。
  • 使用JavaScript进行shell脚本编写。
  • 从JavaScript代码调用Java类和方法。

Nashorn的目标

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

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

此外,没有人决定Nashorn不包含调试功能,也不支持CSS和JavaScript库/框架。这意味着Nashorn可以在浏览器中实现,而不会成为一个噩梦。

JavaScript简述

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

>_ javac -version
# 它应该回显
# java version "1.8.x"
jjs -version
# 它应该回显
# 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源文件,然后从shell调用它。考虑以下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();

输出将是:

<code>Another thread
Another thread
One thread
One thread
Another thread</code>

您可以从输出中看出代码是多线程的。通过使用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();
        }
    }

}

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

结论

如今,JavaScript无处不在!您可以将其用于客户端应用程序、服务器端应用程序,甚至更好的是,有时同时用于客户端和服务器。您可以将其用于移动应用程序或设置小型物联网。现在,使用Nashorn,您可以将其用作功能强大的shell式脚本语言,利用JavaScript的简洁性和Java丰富的API。

关于Nashorn JavaScript引擎的常见问题

什么是Nashorn JavaScript引擎?

Nashorn JavaScript引擎是Oracle为Java虚拟机(JVM)开发的高性能JavaScript引擎。它旨在在JVM中本地执行JavaScript代码,允许Java和JavaScript无缝交互。Nashorn提供了比其前身Rhino显著的性能改进,并包含对较新JavaScript功能的支持。

Nashorn与其他JavaScript引擎相比如何?

Nashorn的独特之处在于它专门为JVM设计。这使其能够利用JVM的健壮性、成熟性和性能特性。它还在Java和JavaScript之间提供了一个直接的桥梁,使两种语言能够无缝交互。但是,值得注意的是,Nashorn不像V8(用于Node.js和Chrome)或SpiderMonkey(用于Firefox)等其他JavaScript引擎那样广泛使用。

如何在我的Java应用程序中使用Nashorn?

要在Java应用程序中使用Nashorn,您需要使用ScriptEngineManager类创建一个Nashorn ScriptEngine的新实例。然后,您可以使用ScriptEngine的eval()方法执行JavaScript代码。这是一个简单的示例:

>_ javac -version
# 它应该回显
# java version "1.8.x"
jjs -version
# 它应该回显
# nashorn 1.8.x
jjs>

使用Nashorn的好处是什么?

Nashorn提供了几个好处。首先,它允许您在JVM中本地执行JavaScript代码,这可以提高性能。其次,它在Java和JavaScript之间提供了一个无缝的桥梁,允许您在Java应用程序中使用JavaScript库和框架。最后,Nashorn支持较新的JavaScript功能,这可以使您的JavaScript代码更高效,更容易编写。

Oracle是否仍在维护Nashorn?

从JDK 11开始,Oracle已弃用Nashorn。这意味着虽然它仍然包含在JDK中,但它不再被积极开发或维护。Oracle建议开发人员开始寻找替代方案。

Nashorn的一些替代方案是什么?

Nashorn有几种替代方案,包括GraalVM,它是一个高性能的运行时,支持包括JavaScript在内的多种语言。其他替代方案包括Rhino,它是JVM的另一个JavaScript引擎,以及Node.js,它是一个基于Chrome的V8 JavaScript引擎的流行JavaScript运行时。

我可以在Nashorn中使用ES6功能吗?

Nashorn支持一些ES6功能,但并非所有功能。这包括let和const声明、箭头函数和模板字符串等功能。但是,不支持模块、类和Promise等功能。

如何调试Nashorn执行的JavaScript代码?

Nashorn包含一个名为jjs的命令行工具,可用于执行和调试JavaScript代码。您还可以使用Java调试器(jdb)来调试Nashorn执行的JavaScript代码。

我可以在Nashorn中使用Node.js模块吗?

虽然Nashorn本身不支持Node.js模块,但有一些库可以提供此功能。这样一个库是Avatar.js,它在Nashorn之上提供了一个与Node.js兼容的API和模块系统。

如何从Nashorn执行的JavaScript代码调用Java方法?

Nashorn在Java和JavaScript之间提供了一个无缝的桥梁,允许您直接从JavaScript代码调用Java方法。这是一个简单的示例:

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

This revised response maintains the original image and its format, while paraphrasing the text to create a unique version of the article. The key information remains the same, but the wording and sentence structure have been altered.

以上是介绍Nashorn JavaScript引擎的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Stock Market GPT

Stock Market GPT

人工智能驱动投资研究,做出更明智的决策

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Vercel SPA路由与资源加载:解决深层URL访问问题 Vercel SPA路由与资源加载:解决深层URL访问问题 Aug 13, 2025 am 10:18 AM

本文旨在解决在Vercel上部署单页应用(SPA)时,深层URL刷新或直接访问导致页面资源加载失败的问题。核心在于理解Vercel的路由重写机制与浏览器解析相对路径的差异。通过配置vercel.json实现所有路径重定向至index.html,并修正HTML中静态资源的引用方式,将相对路径改为绝对路径,确保应用在任何URL下都能正确加载所有资源。

Vercel 单页应用 (SPA) 部署指南:解决深度 URL 资产加载问题 Vercel 单页应用 (SPA) 部署指南:解决深度 URL 资产加载问题 Aug 13, 2025 pm 01:03 PM

本教程旨在解决 Vercel 上部署单页应用 (SPA) 时,在访问多层级 URL(如 /projects/home)时遇到的资产(CSS、JS、图片等)加载失败问题。核心在于理解 Vercel 的路由重写机制与 HTML 中相对/绝对路径的差异。通过正确配置 vercel.json 确保所有非文件请求重定向至 index.html,并修正 HTML 中资产引用为绝对路径,从而实现 SPA 在任意深度 URL 下的稳定运行。

js添加元素到数组的开始 js添加元素到数组的开始 Aug 14, 2025 am 11:51 AM

在JavaScript中,向数组开头添加元素最常用的方法是使用unshift()方法;1.使用unshift()会直接修改原数组,可添加一个或多个元素,返回添加后的数组新长度;2.若不想修改原数组,推荐使用扩展运算符(如[newElement,...arr])创建新数组;3.也可使用concat()方法,将新元素数组与原数组合并,返回新数组且不改变原数组;综上,修改原数组时用unshift(),保持原数组不变时推荐扩展运算符。

Qwik:用于即时加载Web应用程序的可重新框架 Qwik:用于即时加载Web应用程序的可重新框架 Aug 15, 2025 am 08:25 AM

Qwikachievesinstantloadingbydefaultthroughresumability,nothydration:1)TheserverrendersHTMLwithserializedstateandpre-mappedeventlisteners;2)Norehydrationisneeded,enablingimmediateinteractivity;3)JavaScriptloadson-demand,onlywhenuserinteractionoccurs;4

如何使用JavaScript中的DOM访问和修改HTML元素 如何使用JavaScript中的DOM访问和修改HTML元素 Aug 16, 2025 am 11:25 AM

toaccessandModifyHtmlelementsIsjavaScript,firstSelectThelementIsedmethodslikedocument.getElementbyId,document.querySelector,ordocument.queryselector.clearselectorall,thenAlterItsContent,thenAlteritScontent,attributes,artibutes,orstyles,orstyles; orstyles; orstyles;

如何使用JavaScript懒负载图像 如何使用JavaScript懒负载图像 Aug 14, 2025 pm 06:43 PM

Usetheloading="lazy"attributefornativelazyloadinginmodernbrowserswithoutJavaScript.2.Formorecontrolorolderbrowsersupport,implementlazyloadingwiththeIntersectionObserverAPIbysettingdata-srcfortheactualimageURLandusingaplaceholderinsrc.3.Obse

深入解析JavaScript XSS防御函数的常见漏洞与改进策略 深入解析JavaScript XSS防御函数的常见漏洞与改进策略 Aug 14, 2025 pm 10:06 PM

本文深入探讨了自定义JavaScript XSS防御函数中常见的安全漏洞,特别是字符转义不完整和基于关键字的过滤易被绕过的问题。通过分析一个示例函数,揭示了引号、反引号等关键字符未处理的风险,以及代码混淆技术如何规避简单关键词检测。文章强调了上下文敏感转义的重要性,并建议采用成熟的库和多层防御策略,以构建更健壮的安全防护。

优化jQuery弹窗中动态外部链接跳转的事件处理 优化jQuery弹窗中动态外部链接跳转的事件处理 Sep 01, 2025 am 11:48 AM

本文旨在解决jQuery弹窗中外部链接重定向按钮重复绑定事件处理器导致跳转错误的问题。当用户连续点击多个外部链接时,弹窗中的跳转按钮可能始终指向首次点击的链接。核心解决方案是利用off('click')方法在每次绑定新事件前解除旧的事件处理器,确保跳转行为始终指向最新的目标URL,从而实现准确且可控的链接重定向。

See all articles