从 Rhino 迁移到 GraalJS 的指南

本文档作为迁移指南,用于以前针对 Rhino 引擎编写的代码。有关支持的功能概述,请参阅 Java 互操作性指南

Rhino 和 GraalJS 都支持 Java 互操作性的类似语法和语义集。迁移相关的最重要区别列在此处。

Java.type(typename) 代替 java.a.b.c.typename #

GraalJS 不会将可用的 Java 类放入 JavaScript 范围。您必须使用 Java.type(typename) 显式加载类。

GraalJS 支持 Packages 全局对象,但仍建议显式加载类。以下 Java 包全局变量在 Nashorn 兼容模式(js.nashorn-compat 选项)下可用: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 字段或方法。例如,您可以查询 length 属性(JavaScript),但不能在 JavaScript 字符串上调用 length 函数(Java) - length 的行为类似于数据属性,而不是函数。

JavaImporter #

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

联系我们