套件 | 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 物件 (會傳遞作為 Loader 物件之 load()
或 loadBytes()
方法的 context
參數) 的 applicationDomain
屬性所指定。 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()
方法,以取得實際定義的物件。
傳回的 Vector 屬於 String 類型,而每個 String 的格式為:package.path::definitionName
如果 definitionName
在最上層套件中,則會忽略 package.path::
。
以下列類別定義為列:
package my.Example { public class SampleClass extends Sprite { } }
這個方法會傳回「my.Example::SampleClass」。
傳回值Vector.<String> — 屬於定義名稱之字串的未排序 Vector。如果沒有定義,則為空的 Vector。傳回 <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 檔,所以本機安全性必須處於檔案系統層級。
- 為了執行這個範例,"en" 和 "es" 資料夾中必須各自都有名為 Greeter.swf 的 SWF 檔。
請使用下列程式碼,在 "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, 03:47 PM Z