访问 ActionScript 对象

一个 FREObject 类实例表示一个 ActionScript 类对象或基元类型。在 Java 实现中使用 FREObject 实例操作 ActionScript 数据。FREObject 的一个主要用途是用于 Java 函数参数和返回值。

FREObject 类提供函数用于访问关联的 ActionScript 类对象或基元值。所用的 Java API 取决于 ActionScript 对象的类型。这些类型可以是:

  • ActionScript 基元数据类型

  • ActionScript 类对象

  • ActionScript String 对象

  • ActionScript Array 或 Vector 类对象

  • ActionScript ByteArray 类对象

  • ActionScript BitmapData 类对象

重要说明: 您只能在正在运行“所拥有的”FREFunction 函数的同一线程中访问 FREObject。此外,如果您已调用任何 FREByteArray 或 FREBitmapData 对象的 acquire() 方法,则您在调用此原始 FREByteArray 或 FREBitmapData 对象的 release() 方法之前,无法访问任何对象的 ActionScript 方法。如果“获取”了任何对象,调用该对象或其他 FREObject 的 getProperty() setProperty() callMethod() 将引发 IllegalStateException 异常。

FREObject 有效性

如果试图在 Java API 调用中使用无效 FREObject ,Java API 将引发异常。

任何 FREObject 实例只在调用堆栈上的第一个 FREFunction 函数返回之前有效。调用堆栈上的第一个 FREFunction 函数是运行时由于 ActionScript 端调用 ExtensionContext 实例的 call() 方法而调用的函数。FREObject 也只在运行时用来调用第一个 FREFunction 的线程中有效。

注: FREFunction 函数可以间接调用其他 FREFunction 函数。例如, FREFunctionA() 可以调用 ActionScript 对象的方法。该方法随后可以调用 FREFunctionB()

因此,在使用 FREObject 时,应考虑以下事项:

  • 传递给 FREFunction 实例的任何 FREObject 只在调用堆栈上的第一个 FREFunction 函数返回之前有效。

  • 任何 Java 函数创建的任何 FREObject 只在调用堆栈上的第一个 FREFunction 返回之前有效。

  • 不能在另一线程中使用 FREObject。只能在与 Java 函数用于接收或创建 FREObject 对象的同一线程中使用该对象。

  • 例如,在两次调用 FREFunction 函数之间,无法在全局数据中保存 FREObject 引用。由于在调用堆栈上的第一个 FREFunction 函数返回后,该对象将变得无效,因此保存的引用将没有用处。但是,在两次函数调用之间,可以使用 FREContext 类的 setActionScriptData() 方法保存数据。

  • FREObject 失效后,对应的 ActionScript 对象仍然可以存在。例如,如果 FREObject 是 FREFunction 函数的返回值,其对应的 ActionScript 对象将仍然被引用。但是,一旦 ActionScript 端删除其引用,运行时将立即释放 ActionScript 对象。

  • 在扩展间无法共享 FREObject。

    注: 但可以在同一扩展的扩展上下文之间共享 FREObject。不过即使这样,无论是哪种情况,在调用堆栈上的第一个 FREFunction 函数返回到运行时后,FREObject 仍将变得无效。