Пакет | flash.system |
Класс | public final class ApplicationDomain |
Наследование | ApplicationDomain Object |
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | AIR 1.0, Flash Player 9, Flash Lite 4 |
Домены приложений используются, если внешний SWF-файл загружается с помощью класса Loader. Все определения ActionScript 3.0 в загруженном SWF-файле хранятся в домене приложения, который указывается свойством applicationDomain
объекта LoaderContext, передаваемого в параметре context
объекта load()
класса Loader или метода loadBytes()
. Объект LoaderInfo также содержит свойство applicationDomain
, доступное только для чтения.
Все программные коды в SWF-файле определены для существования в домене приложения. Текущим доменом приложения является домен, где выполняется основное приложение. Системный домен содержит все домены приложений, включая текущий домен, и это означает, что он содержит все классы проигрывателя Flash Player.
Каждый домен приложения, исключая системный домен, обладает связанным родительским доменом. Родительский домен домена главного приложения является системным доменом. Загруженные классы определяются только в том случае, если они уже не определены в своих родительских классах. Нельзя перезаписать определение загруженного класса новым определением.
Примеры использования доменов приложений см. в Руководстве разработчика по ActionScript 3.0.
Функция конструктора ApplicationDomain()
позволяет создавать объект ApplicationDomain.
Связанные элементы API
flash.display.Loader.loadBytes()
flash.display.LoaderInfo
flash.net.URLRequest
flash.system.LoaderContext
Свойство | Определено | ||
---|---|---|---|
constructor : Object
Ссылка на объект класса или функцию конструктора для данного экземпляра объекта. | Object | ||
currentDomain : ApplicationDomain [статические] [только для чтения]
Определяет текущий домен приложения, в котором выполняется код пользователя. | ApplicationDomain | ||
domainMemory : ByteArray
Определяет и задает объект, на котором будут выполняться операции глобальной памяти домена в рамках данного ApplicationDomain. | ApplicationDomain | ||
MIN_DOMAIN_MEMORY_LENGTH : uint [статические] [только для чтения]
Определяет минимальную длину объекта памяти, необходимую для использования в качестве ApplicationDomain.domainMemory. | ApplicationDomain | ||
parentDomain : ApplicationDomain [только для чтения]
Определяет родительский домен данного домена приложения. | ApplicationDomain |
Метод | Определено | ||
---|---|---|---|
ApplicationDomain(parentDomain:ApplicationDomain = null)
Создает новый домен приложения. | ApplicationDomain | ||
Получает общедоступное определение от указанного домена приложения. | ApplicationDomain | ||
Получает полные имена из общедоступных определений в указанном домене приложения. | ApplicationDomain | ||
Проверяет существование общедоступного определения в указанном домене приложения. | ApplicationDomain | ||
Показывает, определено ли заданное свойство для объекта. | Object | ||
Показывает, есть ли экземпляр класса Object в цепи прототипов объекта, заданного в качестве параметра. | Object | ||
Показывает наличие заданного свойства и его перечисляемость. | Object | ||
Задает доступность динамического свойства для операций цикла. | Object | ||
Возвращает строковое представление этого объекта, отформатированного в соответствии со стандартами, принятыми для данной локали. | Object | ||
Возвращает строковое представление заданного объекта. | Object | ||
Возвращает элементарное значение заданного объекта. | Object |
currentDomain | свойство |
currentDomain:ApplicationDomain
[только для чтения] Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | AIR 1.0, Flash Player 9, Flash Lite 4 |
Определяет текущий домен приложения, в котором выполняется код пользователя.
Реализация
public static function get currentDomain():ApplicationDomain
domainMemory | свойство |
domainMemory:ByteArray
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 10, AIR 1.5, Flash Lite 4 |
Определяет и задает объект, на котором будут выполняться операции глобальной памяти домена в рамках данного 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 |
Версии среды выполнения: | Flash Player 10, AIR 1.5, Flash Lite 4 |
Определяет минимальную длину объекта памяти, необходимую для использования в качестве ApplicationDomain.domainMemory.
Реализация
public static function get MIN_DOMAIN_MEMORY_LENGTH():uint
parentDomain | свойство |
parentDomain:ApplicationDomain
[только для чтения] Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | AIR 1.0, Flash Player 9, Flash Lite 4 |
Определяет родительский домен данного домена приложения.
Реализация
public function get parentDomain():ApplicationDomain
ApplicationDomain | () | Конструктор |
public function ApplicationDomain(parentDomain:ApplicationDomain = null)
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | AIR 1.0, Flash Player 9, Flash Lite 4 |
Создает новый домен приложения.
ПараметрыparentDomain:ApplicationDomain (default = null ) — Если не указан родительский домен, родительским доменом для этого домена приложения становится системный домен.
|
getDefinition | () | метод |
public function getDefinition(name:String):Object
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | AIR 1.0, Flash Player 9, Flash Lite 4 |
Получает общедоступное определение от указанного домена приложения. Это определение может быть определением класса, пространства имен или функции.
Параметры
name:String — Имя определения.
|
Object — Объект связан с определением.
|
Выдает
ReferenceError — Общедоступного определения с указанным именем не существует.
|
getQualifiedDefinitionNames | () | метод |
public function getQualifiedDefinitionNames():Vector.<String>
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | Flash Player 11.3, AIR 3.3 |
Получает полные имена из общедоступных определений в указанном домене приложения. Это определение может быть определением класса, пространства имен или функции. Имена, возвращенные данным методом, можно передать в метод getDefinition()
для получения объекта фактического определения.
Возвращенный вектор строкового типа, в котором каждая строка имеет формат: package.path::definitionName
Если definitionName
находится в пакете верхнего уровня, то значения package.path::
пропускаются.
Например, для следующего определения класса:
package my.Example { public class SampleClass extends Sprite { } }
Этот метод возвращает my.Example::SampleClass.
ВозвращаетVector.<String> — Несортированный вектор строк, представляющих собой имена определений. Если определение отсутствует, возвращается пустой вектор.Возвращается <строка>.
|
Выдает
SecurityError — Определение принадлежит домену, к которому у вызывающего кода доступа нет.
|
hasDefinition | () | метод |
public function hasDefinition(name:String):Boolean
Язык версии: | ActionScript 3.0 |
Версии среды выполнения: | AIR 1.0, Flash Player 9, Flash Lite 4 |
Проверяет существование общедоступного определения в указанном домене приложения. Это определение может быть определением класса, пространства имен или функции.
Параметры
name:String — Имя определения.
|
Boolean — Устанавливается значениеtrue , если указанное определение существует; в противном случае устанавливается значение false .
|
Примечания.
- Поскольку класс ClassLoader загружает SWF-файл, необходимо обеспечивать локальную безопасность на уровне файловой системы.
- Для выполнения этого примера необходимо наличие SWF-файла с именем RuntimeClasses.swf в той же папке, что и файл ApplicationDomainExample.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)); } }
ApplicationDomain.currentDomain
. В этом случае новый домен приложения ApplicationDomain
создается таким образом, что свойства и методы класса Greeter
любого SWF-файла, загружаемого вторым, не будут замещать свойства и методы первого класса Greeter
. Это можно проверить изменив свойство context.applicationDomain
в методе load
для ClassLoader
.
Примечания.
- Поскольку класс ClassLoader загружает SWF-файл, необходимо обеспечивать локальную безопасность на уровне файловой системы.
- Для выполнения этого примера необходимо иметь два SWF-файла с названиями Greeter.swf, расположенными в папках en и es соответственно.
Создайте файл 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)); } }
Tue Jun 12 2018, 11:34 AM Z