@Deprecated(since="11", forRemoval=true)

模块 jdk.scripting.nashorn

Deprecated, for removal: This API element is subject to removal in a future version.
Nashorn JavaScript script engine and APIs, and the jjs tool are deprecated with the intent to remove them in a future release.
为ECMAScript 5.1中编写的程序提供Nashorn脚本引擎和运行时环境的实现。

Nashorn是用ECMAScript 5.1编写的程序的运行时环境。

用法

使用Nashorn的推荐方法是使用javax.script软件包中的JSR-223 "Scripting for the Java Platform" API。 通常,您将使用以下命令获取Nashorn的ScriptEngine实例:
  import javax.script.*;...ScriptEngine nashornEngine = new ScriptEngineManager().getEngineByName("nashorn"); 
然后像使用任何其他JSR-223脚本引擎一样使用它。 有关详细信息,请参见jdk.nashorn.api.scripting包。

兼容性

Nashorn 100%符合ECMA-262 Standard, Edition 5.1 它需要一个实现JSR-292 "Supporting Dynamically Typed Languages on the Java Platform"规范的Java虚拟机(通常称为“invokedynamic”),以及已经提到的JSR-223。

与Java平台的互操作性

除了作为100%ECMAScript 5.1运行时,Nashorn还提供了ECMAScript程序与Java平台的互操作性功能。 通常,从脚本中可以看到放入脚本引擎上下文的任何Java对象。 就标准而言,这些Java对象不被视为“本机对象”,而是“主机对象”,如4.3.8节中所定义。 与本机对象相比,这种区别允许在处理它们时存在某些语义差异。 在大多数情况下,Java对象的行为与本机对象的行为相同:您可以调用其方法,获取和设置其属性。 但是,在大多数情况下,您无法向其添加任意属性,也无法删除现有属性。

Java集合处理

本机Java数组和List支持通过属性访问器对其元素进行索引访问, Map通过点和方括号属性访问器支持属性和元素访问,不同之处在于点运算符优先于对象属性(字段和属性定义为getXxxsetXxx方法)而方括号运算符优先使用地图元素。 本机Java数组公开length属性。

ECMAScript原始类型

ECMAScript的原始类型为数字,字符串,和布尔被表示与NumberCharSequence ,和Boolean对象。 虽然最常用的号码类型为Double ,最经常使用的字符串类型为String ,不依赖于它作为各种内部优化造成的其他子类Number和内部实现CharSequence使用。

输入转化次数

当调用Java对象上的方法时,使用所有允许的ECMAScript转换将参数转换为Java方法的形式参数类型。 这可能是令人惊讶的,因为一般情况下,根据标准的第9.3节“ToNumber”等,从字符串到数字的转换将成功; string to boolean,number to boolean,Object to number,Object to string all work。 请注意,如果Java方法的声明参数类型为java.lang.Object ,则传递Nashorn对象时不进行任何转换; 特别是如果传递的JavaScript值是原始字符串类型,则只能依赖它是java.lang.CharSequence ,如果值是数字,则只能依赖它为java.lang.Number 如果声明的Java方法参数类型更具体(例如java.lang.Stringjava.lang.Double ),那么Nashorn当然会确保传递所需的类型。

SAM类型

作为调用Java方法时的特殊扩展,可以传递ECMAScript函数对象来代替其Java类型为所谓的“单抽象方法”或“SAM”类型的参数。 虽然这个名称通常涵盖单方法接口,但Nashorn的功能更多,如果所有抽象方法都是同名的重载,它会将类型识别为SAM类型,并且它是一个接口,或者它是一个抽象带有无参数构造函数的类。 类型本身必须是公共的,而构造函数和方法可以是公共的或受保护的。 如果存在多个同名的抽象重载,则单个函数将作为所有这些的共享实现, 此外它还将覆盖任何同名的非抽象方法 这样做是为了与ECMAScript不具有重载方法的概念一致。

Java对象

Nashorn公开了一个名为Java的非标准全局对象,它是Java平台特定功能的主要API入口点。 您可以使用它来创建Java类的实例,从Java数组转换为本机数组并返回,等等。

其他非标准内置对象

除了Java ,犀牛也暴露了一些其他非标准内置对象: JSAdapterJavaImporter
模块图:
Module graph for jdk.scripting.nashornModule graph for jdk.scripting.nashorn
从以下版本开始:
9