| 包 | flash.system |
| 类 | public final class ApplicationDomain |
| 继承 | ApplicationDomain Object |
| 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
在通过 Loader 类加载外部 SWF 文件时会使用应用程序域。加载的 SWF 文件中的所有 ActionScript 3.0 定义都存储在由 LoaderContext 对象的 applicationDomain 属性指定的应用程序域中,此对象是您为 Loader 对象的 load() 或 loadBytes() 方法传递的 context 参数。LoaderInfo 对象还包含一个只读的 applicationDomain 属性。
SWF 文件中的所有代码被定义为存在于应用程序域中。主应用程序就在当前的应用程序域中运行。系统域中包含所有应用程序域(包括当前域),这意味着它包含所有 Flash Player 类。
除系统域以外,每个应用程序域都有一个关联的父域。主应用程序的应用程序域的父域是系统域。已加载的类仅在其父级中没有相关定义时才进行定义。不能用较新的定义覆盖已加载的类定义。
有关应用程序域的用法示例,请参阅《ActionScript 3.0 编程》。
使用 ApplicationDomain() 构造函数可以创建 ApplicationDomain 对象。
另请参见
| 属性 | 定义方 | ||
|---|---|---|---|
![]() | constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | |
| currentDomain : ApplicationDomain [静态] [只读 (read-only)] 获取正在其中执行代码的当前应用程序域。 | ApplicationDomain | ||
| domainMemory : ByteArray 获取并设置将在此 ApplicationDomain 中对其执行域全局内存操作的对象。 | ApplicationDomain | ||
| MIN_DOMAIN_MEMORY_LENGTH : uint [静态] [只读 (read-only)] 获取用作 ApplicationDomain.domainMemory 所需的最小内存对象长度. | ApplicationDomain | ||
| parentDomain : ApplicationDomain [只读 (read-only)] 获取该应用程序域的父域。 | ApplicationDomain | ||
![]() | prototype : Object [静态]
对类或函数对象的原型对象的引用。 | Object | |
| 方法 | 定义方 | ||
|---|---|---|---|
ApplicationDomain(parentDomain:ApplicationDomain = null) 创建一个新的应用程序域。 | ApplicationDomain | ||
从指定的应用程序域获取一个公共定义。 | ApplicationDomain | ||
检查指定的应用程序域之内是否存在一个公共定义。 | ApplicationDomain | ||
![]() |
指示对象是否已经定义了指定的属性。 | Object | |
![]() |
指示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | |
![]() |
指示指定的属性是否存在、是否可枚举。 | Object | |
![]() |
设置循环操作动态属性的可用性。 | Object | |
![]() |
返回指定对象的字符串表示形式。 | Object | |
![]() |
返回指定对象的原始值。 | Object | |
| currentDomain | 属性 |
currentDomain:ApplicationDomain [只读 (read-only)] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
获取正在其中执行代码的当前应用程序域。
public static function get currentDomain():ApplicationDomain另请参见
| domainMemory | 属性 |
domainMemory:ByteArray [读写] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10, AIR 1.5 |
获取并设置将在此 ApplicationDomain 中对其执行域全局内存操作的对象。
public function get domainMemory():ByteArray public function set domainMemory(value:ByteArray):void| MIN_DOMAIN_MEMORY_LENGTH | 属性 |
MIN_DOMAIN_MEMORY_LENGTH:uint [只读 (read-only)] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10, AIR 1.5 |
获取用作 ApplicationDomain.domainMemory 所需的最小内存对象长度。
public static function get MIN_DOMAIN_MEMORY_LENGTH():uint| parentDomain | 属性 |
parentDomain:ApplicationDomain [只读 (read-only)] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
获取该应用程序域的父域。
public function get parentDomain():ApplicationDomain另请参见
| ApplicationDomain | () | 构造函数 |
public function ApplicationDomain(parentDomain:ApplicationDomain = null)| 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
创建一个新的应用程序域。
参数parentDomain:ApplicationDomain (default = null) — 如果未传入父域,此应用程序域将使用系统域作为其父域。 |
| getDefinition | () | 方法 |
public function getDefinition(name:String):Object| 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
从指定的应用程序域获取一个公共定义。该定义可以是一个类、一个命名空间或一个函数的定义。
参数
name:String — 定义的名称。 |
Object — 与此定义关联的对象。 |
ReferenceError — 不存在具有指定名称的公共定义。 |
| hasDefinition | () | 方法 |
public function hasDefinition(name:String):Boolean| 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
检查指定的应用程序域之内是否存在一个公共定义。该定义可以是一个类、一个命名空间或一个函数的定义。
参数
name:String — 定义的名称。 |
Boolean —
如果指定的定义存在,则返回 true 值;否则,返回 false。
|
注意:
首先,使用下面的代码创建 RuntimeClasses.swf 文件:
package {
import flash.display.Sprite;
public class RuntimeClasses extends Sprite
{
public function RuntimeClasses()
{}
public function greet():String {
return("Hello World");
}
}
}然后实现下面的代码:
package {
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.errors.IllegalOperationError;
import flash.events.Event;
import flash.text.TextField;
public class ApplicationDomainExample extends Sprite {
private var loader:ClassLoader;
private var tf:TextField = new TextField();
public function ApplicationDomainExample() {
addChild(tf);
loader = new ClassLoader();
loader.addEventListener(ClassLoader.LOAD_ERROR,loadErrorHandler);
loader.addEventListener(ClassLoader.CLASS_LOADED,classLoadedHandler);
loader.load("RuntimeClasses.swf");
}
private function loadErrorHandler(e:Event):void {
tf.text = "Load failed";
throw new IllegalOperationError("Cannot load the specified file.");
}
private function classLoadedHandler(e:Event):void {
var runtimeClassRef:Class = loader.getClass("RuntimeClasses");
var greeter:Object = new runtimeClassRef();
tf.text = greeter.greet();
}
}
}
import flash.display.Loader;
import flash.errors.IllegalOperationError;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
class ClassLoader extends EventDispatcher {
public static var CLASS_LOADED:String = "classLoaded";
public static var LOAD_ERROR:String = "loadError";
private var loader:Loader;
private var swfLib:String;
private var request:URLRequest;
private var loadedClass:Class;
public function ClassLoader() {
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
}
public function load(lib:String):void {
swfLib = lib;
request = new URLRequest(swfLib);
var context:LoaderContext = new LoaderContext();
context.applicationDomain=ApplicationDomain.currentDomain;
loader.load(request,context);
}
public function getClass(className:String):Class {
try {
return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
} catch (e:Error) {
throw new IllegalOperationError(className + " definition not found in " + swfLib);
}
return null;
}
private function completeHandler(e:Event):void {
dispatchEvent(new Event(ClassLoader.CLASS_LOADED));
}
private function ioErrorHandler(e:Event):void {
dispatchEvent(new Event(ClassLoader.LOAD_ERROR));
}
private function securityErrorHandler(e:Event):void {
dispatchEvent(new Event(ClassLoader.LOAD_ERROR));
}
}ApplicationDomain.currentDomain。在本例中,创建一个新的 ApplicationDomain,因此无论 SWF 第二次加载哪一个 Greeter 类,该类的属性和方法都不会替换第一个 Greeter 类的属性和方法。您可以通过修改 ClassLoader 的 load 方法中的 context.applicationDomain 属性来测试这一点。
注意:
使用以下代码在“en”目录下创建一个 Greeter.as 文件:
package {
import flash.display.Sprite;
public class Greeter extends Sprite
{
public function Greeter()
{
}
public function greet():String {
return("Good Morning");
}
}
}然后在“es”目录下创建一个十分相似的 Greeter.as 文件:
package {
import flash.display.Sprite;
public class Greeter extends Sprite
{
public function Greeter()
{
}
public function greet():String {
return("Buenos Dias");
}
}
}编译两个 SWF 文件,然后实现以下代码:
package {
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.errors.IllegalOperationError;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
public class ApplicationDomainExample2 extends Sprite {
private var spanishGreeterLoader:ClassLoader;
private var englishGreeterLoader:ClassLoader;
private var tf:TextField = new TextField();
private var greetersLoaded:uint = 0;
public function ApplicationDomainExample2() {
tf.autoSize = TextFieldAutoSize.LEFT;
addChild(tf);
spanishGreeterLoader = new ClassLoader();
spanishGreeterLoader.addEventListener(ClassLoader.LOAD_ERROR,loadErrorHandler);
spanishGreeterLoader.addEventListener(ClassLoader.CLASS_LOADED,classLoadedHandler);
spanishGreeterLoader.load("es/Greeter.swf");
englishGreeterLoader = new ClassLoader();
englishGreeterLoader.addEventListener(ClassLoader.LOAD_ERROR,loadErrorHandler);
englishGreeterLoader.addEventListener(ClassLoader.CLASS_LOADED,classLoadedHandler);
englishGreeterLoader.load("en/Greeter.swf");
}
private function loadErrorHandler(e:Event):void {
tf.text = "Load failed";
throw new IllegalOperationError("Cannot load the specified file.");
}
private function classLoadedHandler(e:Event):void {
greetersLoaded++;
if(greetersLoaded == 2) {
greet();
}
}
private function greet():void {
var spanishGreeter:Class = spanishGreeterLoader.getClass("Greeter");
var englishGreeter:Class = englishGreeterLoader.getClass("Greeter");
var greeter1 = new spanishGreeter();
var greeter2 = new englishGreeter();
tf.text = greeter1.greet() + "\n" + greeter2.greet();
}
}
}
import flash.display.Loader;
import flash.errors.IllegalOperationError;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
class ClassLoader extends EventDispatcher {
public static var CLASS_LOADED:String = "classLoaded";
public static var LOAD_ERROR:String = "loadError";
private var loader:Loader;
private var swfLib:String;
private var request:URLRequest;
private var loadedClass:Class;
public function ClassLoader() {
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
}
public function load(lib:String):void {
swfLib = lib;
request = new URLRequest(swfLib);
var context:LoaderContext = new LoaderContext();
// context.applicationDomain = ApplicationDomain.currentDomain;
context.applicationDomain = new ApplicationDomain();
loader.load(request,context);
}
public function getClass(className:String):Class {
try {
return loader.contentLoaderInfo.applicationDomain.getDefinition(className) as Class;
} catch (e:Error) {
throw new IllegalOperationError(className + " definition not found in " + swfLib);
}
return null;
}
private function completeHandler(e:Event):void {
dispatchEvent(new Event(ClassLoader.CLASS_LOADED));
}
private function ioErrorHandler(e:Event):void {
dispatchEvent(new Event(ClassLoader.LOAD_ERROR));
}
private function securityErrorHandler(e:Event):void {
dispatchEvent(new Event(ClassLoader.LOAD_ERROR));
}
}