flash.system
public final class ApplicationDomain
继承ApplicationDomain Inheritance Object

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

ApplicationDomain 类是分散的类定义组的一个容器。应用程序域用于划分位于同一个安全域中的类。它们允许同一个类存在多个定义,并且允许子级重用父级定义。

在通过 Loader 类加载外部 SWF 文件时会使用应用程序域。加载的 SWF 文件中的所有 ActionScript 3.0 定义都存储在由 LoaderContext 对象的 applicationDomain 属性指定的应用程序域中,此对象是您为 Loader 对象的 load()loadBytes() 方法传递的 context 参数。LoaderInfo 对象还包含一个只读的 applicationDomain 属性。

SWF 文件中的所有代码被定义为存在于应用程序域中。主应用程序就在当前的应用程序域中运行。系统域中包含所有应用程序域(包括当前域),这意味着它包含所有 Flash Player 类。

除系统域以外,每个应用程序域都有一个关联的父域。主应用程序的应用程序域的父域是系统域。已加载的类仅在其父级中没有相关定义时才进行定义。不能用较新的定义覆盖已加载的类定义。

有关应用程序域的用法示例,请参阅《ActionScript 3.0 编程》

使用 ApplicationDomain() 构造函数可以创建 ApplicationDomain 对象。

查看示例

另请参见

flash.display.Loader.load()
flash.display.Loader.loadBytes()
flash.display.LoaderInfo
flash.net.URLRequest
flash.system.LoaderContext
Using the ApplicationDomain class


公共属性
 属性定义方
 Inheritedconstructor : 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
 Inheritedprototype : Object
[静态] 对类或函数对象的原型对象的引用。
Object
公共方法
 方法定义方
  
创建一个新的应用程序域。
ApplicationDomain
  
从指定的应用程序域获取一个公共定义。
ApplicationDomain
  
检查指定的应用程序域之内是否存在一个公共定义。
ApplicationDomain
 Inherited
指示对象是否已经定义了指定的属性。
Object
 Inherited
指示 Object 类的实例是否在指定为参数的对象的原型链中。
Object
 Inherited
指示指定的属性是否存在、是否可枚举。
Object
 Inherited
设置循环操作动态属性的可用性。
Object
 Inherited
返回指定对象的字符串表示形式。
Object
 Inherited
返回指定对象的原始值。
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
示例 如何使用示例
ApplicationDomainExample.as

下例演示了如何加载运行时类,以及如何调用位于另一个 SWF 中的类的公共方法。

注意:

首先,使用下面的代码创建 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));
    }
}
ApplicationDomainExample.2.as

如果有多个 SWF 文件中包含名称相同但实现方式不同的编译类,可以根据此示例将外部加载的 SWF 文件的类相互区分开来。先前,已指示子 SWF 使用 ApplicationDomain.currentDomain。在本例中,创建一个新的 ApplicationDomain,因此无论 SWF 第二次加载哪一个 Greeter 类,该类的属性和方法都不会替换第一个 Greeter 类的属性和方法。您可以通过修改 ClassLoaderload 方法中的 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));
    }
}