Главная / Action Script 3
Пакетflash.system
Классpublic final class ApplicationDomain
НаследованиеApplicationDomain Inheritance Object

Язык версии : ActionScript 3.0
Версии среды выполнения:  1.0 9

Класс ApplicationDomain является контейнером для дискретных групп определений классов. Домены приложений используются для разделения классов, входящих в один и тот же домен защиты. Они разрешают существование нескольких определений одного и того же класса и позволяют дочерним объектам использовать родительские определения.

Домены приложений используются, если внешний SWF-файл загружается с помощью класса Loader. Все определения ActionScript 3.0 в загруженном SWF-файле хранятся в домене приложения, который указывается свойством applicationDomain объекта LoaderContext, передаваемого в параметре context объекта load() класса Loader или метода loadBytes(). Объект 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
Использование класса ApplicationDomain


Общедоступные свойства
 СвойствоОпределено
 Inheritedconstructor : Object
Ссылка на объект класса или функцию конструктора для данного экземпляра объекта.
Object
  currentDomain : ApplicationDomain
[статические] [только для чтения] Определяет текущий домен приложения, в котором выполняется код пользователя.
ApplicationDomain
  domainMemory : ByteArray
Определяет и задает объект, на котором будут выполняться операции глобальной памяти домена в рамках данного ApplicationDomain.
ApplicationDomain
  MIN_DOMAIN_MEMORY_LENGTH : uint
[статические] [только для чтения] Определяет минимальную длину объекта памяти, необходимую для использования в качестве ApplicationDomain.domainMemory.
ApplicationDomain
  parentDomain : ApplicationDomain
[только для чтения] Определяет родительский домен данного домена приложения.
ApplicationDomain
 Inheritedprototype : Object
[статические] Ссылка на модель объекта класса или функции.
Object
Общедоступные методы
 МетодОпределено
  
Создает новый домен приложения.
ApplicationDomain
  
Получает общедоступное определение от указанного домена приложения.
ApplicationDomain
  
Проверяет существование общедоступного определения в указанном домене приложения.
ApplicationDomain
 Inherited
Показывает, определено ли заданное свойство для объекта.
Object
 Inherited
Показывает, есть ли экземпляр класса Object в цепи прототипов объекта, заданного в качестве параметра.
Object
 Inherited
Показывает наличие заданного свойства и его перечисляемость.
Object
 Inherited
Задает доступность динамического свойства для операций цикла.
Object
 Inherited
Возвращает строковое представление заданного объекта.
Object
 Inherited
Возвращает элементарное значение заданного объекта.
Object
Сведения о свойстве
currentDomainсвойство
currentDomain:ApplicationDomain  [только для чтения]

Язык версии : ActionScript 3.0
Версии среды выполнения:  1.0 9

Определяет текущий домен приложения, в котором выполняется код пользователя.



Реализация
    public static function get currentDomain():ApplicationDomain

См. также

domainMemoryсвойство 
domainMemory:ByteArray  [чтение и запись]

Язык версии : ActionScript 3.0
Версии среды выполнения:  10, 1.5

Определяет и задает объект, на котором будут выполняться операции глобальной памяти домена в рамках данного ApplicationDomain.



Реализация
    public function get domainMemory():ByteArray
    public function set domainMemory(value:ByteArray):void
MIN_DOMAIN_MEMORY_LENGTHсвойство 
MIN_DOMAIN_MEMORY_LENGTH:uint  [только для чтения]

Язык версии : ActionScript 3.0
Версии среды выполнения:  10, 1.5

Определяет минимальную длину объекта памяти, необходимую для использования в качестве ApplicationDomain.domainMemory.



Реализация
    public static function get MIN_DOMAIN_MEMORY_LENGTH():uint
parentDomainсвойство 
parentDomain:ApplicationDomain  [только для чтения]

Язык версии : ActionScript 3.0
Версии среды выполнения:  1.0 9

Определяет родительский домен данного домена приложения.



Реализация
    public function get parentDomain():ApplicationDomain

См. также

Сведения о конструкторе
ApplicationDomain()Конструктор
public function ApplicationDomain(parentDomain:ApplicationDomain = null)

Язык версии : ActionScript 3.0
Версии среды выполнения:  1.0 9

Создает новый домен приложения.

Параметры
parentDomain:ApplicationDomain (default = null) — Если конкретно не указан родительский домен, родительским доменом для этого домена приложения становится системный домен.
Сведения о методе
getDefinition()метод
public function getDefinition(name:String):Object

Язык версии : ActionScript 3.0
Версии среды выполнения:  1.0 9

Получает общедоступное определение от указанного домена приложения. Это определение может быть определением класса, пространства имен или функции.

Параметры

name:String — Имя определения.

Возвращает
Object — Объект связан с определением.

Выдает
ReferenceError — Общедоступного определения с указанным именем не существует.
hasDefinition()метод 
public function hasDefinition(name:String):Boolean

Язык версии : ActionScript 3.0
Версии среды выполнения:  1.0 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 создается таким образом, что свойства и методы класса Greeter любого SWF-файла, загружаемого вторым, не будут замещать свойства и методы первого класса Greeter. Это можно проверить, модифицировав свойство context.applicationDomain в методе load для ClassLoader.

Примечания.

Создайте файл Greeter.as в каталоге "en", используя следующий программный код:

 package {
    import flash.display.Sprite;

    public class Greeter extends Sprite
    {
        public function Greeter()
        {
        }
        
        public function greet():String {
            return("Good Morning");
        }
    }
}
 

Затем создайте аналогичный файл Greeter.as в каталоге "es":

 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));
    }
}