从 Rhino 迁移到 GraalJS 指南

本文档旨在为之前面向 Rhino 引擎的代码提供迁移指南。有关支持功能的概述,请参阅 Java 互操作性指南

Rhino 和 GraalJS 都支持一套相似的 Java 互操作性语法和语义。以下列出了与迁移相关的最重要差异。

Java.type(typename) 而非 java.a.b.c.typename #

GraalJS 不会将可用的 Java 类放入 JavaScript 作用域中。您必须使用 Java.type(typename) 显式加载这些类。

GraalJS 支持 Packages 全局对象,但仍建议显式加载类。在 Nashorn 兼容模式(js.nashorn-compat 选项)下,可以使用以下 Java 包全局变量:javajavafxjavaxcomorgedu

Java 类和 Java 对象的控制台输出 #

GraalJS 提供了内置的 print 函数。它会尝试对 Java 类和 Java 对象的行为进行特殊处理,以提供最有效的输出。

请注意,GraalJS 还提供了 console.log 函数。在纯 JavaScript 模式下,它是 print 的别名,但在 Node 模式下,它使用 Node.js 提供的实现。在 Node 模式下,console.log 对互操作对象的行为有所不同,因为它不对这类对象进行特殊处理。

JavaScript 字符串与 Java 字符串 #

GraalJS 内部使用 Java 字符串来表示 JavaScript 字符串。这使得无法区分特定字符串是由 JavaScript 还是 Java 代码创建的。在 GraalJS 中,JavaScript 属性优先于 Java 字段或方法。例如,您可以查询 JavaScript 字符串的 length 属性(JavaScript),但不能调用 length 函数(Java)—— length 的行为类似于数据属性,而非函数。

JavaImporter #

JavaImporter 功能仅在 Nashorn 兼容模式(js.nashorn-compat)下可用。

联系我们