首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >flash.utils.getDefinitionByName与应用程序域的类定义方法

flash.utils.getDefinitionByName与应用程序域的类定义方法
EN

Stack Overflow用户
提问于 2014-03-31 17:04:17
回答 1查看 780关注 0票数 3

这两个方法组在使用的类集(即ApplicationDomain的类定义集与getDefinitionByName使用的类定义集)方面有什么不同?

  1. ApplicationDomain。getDefinition / hasDefinition / getQualifiedDefinitionNames (仅限Flash 11.3+,无证)
  2. getDefinitionByName

很明显,存在应用程序域层次结构,定义在某些应用程序域中是可见的,而在其他应用域中则是不可见的。例如,ApplicationDomain.getDefinition是否会返回一个未在给定应用程序域中定义但可从其访问的定义?(例如,如果域是子域,而我们正在查找父域中定义的定义?)ApplicationDomain的文档只是说“只有当加载的类的父类还没有定义时才定义它们”。但它也说:"(ApplicationDomains)允许存在同一个类的多个定义,并允许子类重用父定义。“

文档还指出,getDefinitionByName返回类定义,而ApplicationDomain.getDefinition除了返回类定义之外,还将返回命名空间和函数定义。

假设我只对类定义感兴趣,那么ApplicationDomains getDefinitionByName搜索什么?(例如,所有域、当前/调用方域或调用方可访问的任何域?)

这一初步测试令人困惑:

代码语言:javascript
复制
import flash.system.ApplicationDomain;
var d:ApplicationDomain = new ApplicationDomain( ApplicationDomain.currentDomain ); //child of current domain
trace(ApplicationDomain.currentDomain.hasDefinition("flash.display.DisplayObject")); //true
trace(ApplicationDomain.currentDomain.getQualifiedDefinitionNames().length); //1 (the main timeline class definition only: Untitled_fla::MainTimeline) 
trace(d.hasDefinition("flash.display.DisplayObject")); //false

一方面,在上面的测试中,getQualifiedDefinitionNames报告说在当前的应用程序域中只定义了主时间线类,而getDefinition为DisplayObject返回true,这表明它报告父(系统)域中存在定义,但是外孙域上的最终跟踪与返回false相矛盾。

ApplicationDomain.currentDomain.parentDomain还返回null,这与以下文档声明直接矛盾:“系统域包含所有应用程序域,包括当前域.”“除系统域外,每个应用程序域都有关联的父域。主应用程序应用程序域的父域是系统域。”

这里的矛盾非常明显,currentDomain有定义,但是当您创建子域并访问父域(应该是currentDomain )时,它突然报告说它不包含该定义:

代码语言:javascript
复制
trace(ApplicationDomain.currentDomain.hasDefinition("flash.display.DisplayObject")); //true
trace((new ApplicationDomain( ApplicationDomain.currentDomain )).parentDomain.hasDefinition("flash.display.DisplayObject")); //false! why?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-31 18:44:12

这个页面相当全面:http://www.senocular.com/flash/tutorials/contentdomains/?page=2我已经解决了几个谜团,但是上面概述的基本问题(特别是关于getDefinitionByName的范围)仍然有效。我只想给出我能解决的问题的答案。

如果父域是系统域,则parentDomain将返回null。因此,尽管parentDomain是系统域,但parentDomain属性仍然返回null。事情就是这样。不幸的是,这使得系统域无法访问,例如,通过getQualifiedDefinitionNames进行类枚举。

关于我的初步测试,构建一个新的ApplicationDomain似乎会创建一个死对象,直到SWF实际加载到该域下。例如,创建当前域的子域并在其上调用hasDefinition将返回false,但如果将相同的实例分配给加载程序上下文并将其传递给Loader.load,则一旦加载完成,您可以对最初返回false的实例调用hasDefinition,然后它将返回true。因此,您可以与父类一起构造ApplicationDomain,但在积极使用它之前,它不会真正发挥作用。

代码语言:javascript
复制
var d:ApplicationDomain = new ApplicationDomain( ApplicationDomain.currentDomain ); //child of current domain
trace(d.hasDefinition( "flash.display.DisplayObject" )); //false for now...
var l:Loader = new Loader();
l.load(new URLRequest( "any.swf"), new LoaderContext( false, d ) );
l.contentLoaderInfo.addEventListener( Event.COMPLETE, completed, false, 0, true );
function completed(e:Event ):void
{
    trace(d.hasDefinition( "flash.display.DisplayObject" ); //...and now it's true.
}

因此,ApplicationDomain.getDefinition似乎确实报告了父域、祖父母域等域中的类,但只有在通过向其加载新的ApplicationDomain实例之后才会这样做。

此外,ApplicationDomain实例可能引用相同的应用程序域,但它们不能直接比较。例如,(ApplicationDomain.currentDomain == ApplicationDomain.currentDomain)为false。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22767776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档