ApplicationDomain

转自:http://blog.sina.com.cn/s/blog_5e8302c80100cxxz.html

ApplicationDomain

(终于消除了长久以来对ApplicationDomain的误解,原来一直以为这是一个和安全沙箱有关内容,看来我真的错了。在 flash_as3_programming中有详细的解释。
 
  • 应用程序域 (Application domain):用于将不同 SWF 文件中使用的类分开的机制,以便在 SWF 文件包含具有相同名称的不同类时,这些类不会彼此覆盖。

     每个安全域被分成一个或多个由 ApplicationDomain 对象表示的应用程序域。 应用程序域并不是用于安全目的;它们用于管理 ActionScript 代码的协作单元。 如果是从其它域加载 SWF 文件,并允许将它放置到另外一个安全域中,则您将无法控制所加载的 SWF 文件被放置到哪个应用程序域中;即使您指定应选择某个应用程序域,也会忽略。 但是,如果是将 SWF 文件加载到您自己的安全域中(因为此 SWF 文件来自您自己的域,或者您正在将它导入到您的安全域中),您就可以控制为所加载的 SWF 文件选择哪个应用程序域。

应用程序域有三种类型,系统域子域(新的应用程序域)、当前应用程序域、当前应用程序域的子域。他们的关系就像是这样
 

ApplicationDomain

ApplicationDomain


ApplicationDomain 类的用途是存储 ActionScript 3.0 定义表。SWF 文件中的所有代码被定义为存在于应用程序域中。可以使用应用程序域划分位于同一个安全域中的类。这允许同一个类存在多个定义,并且还允许子级重用父级定义。
利用ApplicationDomain加载类定义的代码如下
1.  var urlRequest:URLRequest = new URLRequest(url);
2.  var loader:Loader = new Loader();
3.  var context:LoaderContext = new LoaderContext();
4.  //当前域
5.  context.applicationDomain = ApplicationDomain.currentDomain;
6.  //新应用程序域
7.  //context.applicationDomain = new ApplicationDomain();
8.  //当前域子域
9.  //context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
10.  loader.load(urlRequest, context);
当加载完成后我们可以像这样来使用加载的类定义
1.  //这里的ClassDefinitionName是我们在被加载的swf中的类定义的名称
2.  var AClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition(ClassDefinitionName) as Class;
3.  new AClass();
下面就说说这三个不同的域

1、当前域
ApplicationDomain 类的用途是存储 ActionScript 3.0 定义表,在当前域中加载类定义后,如果当前域中已经有了同名的类定义,那么新加载的类定义不会覆盖原来的(这一点要注意),原来没有的会添加到as3的定义表中。
这可让您将新的类定义添加到应用程序的当前一组类定义中。这可用于主应用程序的运行时共享库。加载的 SWF 被视为远程共享库 (RSL)。使用此方法可以在应用程序启动之前使用预加载器加载 RSL。
2、新应用程序域
在系统域中新建一个应用程序域,他和当前域是平级的。这样我们可以对相同名称的类,可以有两个完全不同的定义。
此方法的一个用处是使旧版应用程序能够动态加载相同应用程序的更新版本,而不会发生冲突。之所以不发生冲突,是因为尽管使用的是同样的类名称,但它们划分到不同的应用程序域中。
3、当前域子域
在当前域中新建一个子域。这里也有一个要注意的,就是当父级域中(也就是当前域)没有同名的定义时,子域中的类才会被定义。
此方法的一个用处可能是作为一个使用主应用程序的类型的多屏幕丰富 Internet 应用程序 (RIA) 模块,该模块作为主应用程序的子级加载。如果能够确保所有类始终更新为向后兼容,并且正在加载的应用程序始终比其加载的软件的版本新,则子级将使用父级版本。如果可以确保不继续拥有对子级 SWF 的引用,则拥有了新的应用程序域还使您能够卸载所有的类定义以便于垃圾回收。此方法使加载的模块可以共享加载者的 singleton 对象和静态类成员。

你可能感兴趣的:(application)