如果有多个 SWF 文件中包含名称相同但实现方式不同的编译类,可以根据此示例将外部加载的 SWF 文件的类相互区分开来。先前,已指示子 SWF 使用
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");
}
}
}
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");
}
}
}
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));
}
}
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));
}
}