包 | flash.system |
类 | public final class ApplicationDomain |
继承 | ApplicationDomain Object |
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9, Flash Lite 4 |
在通过 Loader 类加载外部 SWF 文件时会使用应用程序域。加载的 SWF 文件中的所有 ActionScript 3.0 定义都存储在由 LoaderContext 对象的 applicationDomain
属性指定的应用程序域中,此对象是您为 Loader 对象的 load()
或 loadBytes()
方法传递的 context
参数。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 | 属性 |
MIN_DOMAIN_MEMORY_LENGTH | 属性 |
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()
方法,以获取实际定义的对象。
返回的矢量为 String 类型,每个字符串的格式为:package。path::definitionName
如果 definitionName
在顶级包中,则去除 package。path::
。
以下面的类定义为例:
package my.Example { public class SampleClass extends Sprite { } }
此方法返回“my.Example::SampleClass”。
返回Vector.<String> — 作为定义名称的无序字符串矢量。如果无定义,则是一个空矢量。返回 <String>。
|
引发
SecurityError — 此定义属于调用代码不具有访问权限的域。
|
hasDefinition | () | 方法 |
注意:
- 由于 ClassLoader 类要加载 SWF 文件,因此需要文件系统级别的本地安全性。
- 要运行此示例,在 ApplicationDomainExample.swf 文件所在的文件夹中必须存在一个名为 RuntimeClasses.swf 的 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
,因此无论 SWF 第二次加载哪一个 Greeter
类,该类的属性和方法都不会替换第一个 Greeter
类的属性和方法。您可以通过修改 ClassLoader
的 load
方法中的 context.applicationDomain
属性来测试这一点。
注意:
- 由于 ClassLoader 类要加载 SWF 文件,因此需要文件系统级别的本地安全性。
- 要运行此示例,必须存在两个名为 Greeter.swf 的 SWF 文件,分别位于“en”和“es”文件夹中。
使用以下代码在“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)); } }
Tue Jun 12 2018, 11:04 AM Z