就使用的类集而言,这两个方法组之间有什么区别(即ApplicationDomain的类定义集与getDefinitionByName使用的类定义集)?
ApplicationDomain。 getDefinition / hasDefinition / getQualifiedDefinitionNames(仅Flash Player 11.3+,未记录)
getDefinitionByName
显然,存在一个应用程序域层次结构,并且某些应用程序域中的定义可能可见,而其他应用程序域中则不可见。例如,ApplicationDomain.getDefinition是否返回一个在给定应用程序域中未定义但可以从中访问的定义? (例如,如果该域是子域,而我们正在查找在父域中定义的定义?)ApplicationDomain的文档仅显示“仅当其父类尚未定义已加载的类时才定义它们。”但它也说:“(ApplicationDomains)允许存在同一类的多个定义,并允许子级重用父级定义。”
该文档还指出,getDefinitionByName返回类定义,而ApplicationDomain.getDefinition除了类定义之外还将返回名称空间和函数定义。
假设我只对类定义感兴趣,那么getDefinitionByName会搜索哪些ApplicationDomains? (例如,所有域,仅当前/呼叫者域还是呼叫者可访问的任何域?)
此初始测试令人困惑:
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)时,它突然报告它不包含定义:
trace(ApplicationDomain.currentDomain.hasDefinition("flash.display.DisplayObject")); //true
trace((new ApplicationDomain( ApplicationDomain.currentDomain )).parentDomain.hasDefinition("flash.display.DisplayObject")); //false! why?
最佳答案
该页面非常全面:http://www.senocular.com/flash/tutorials/contentdomains/?page=2我设法解决了两个谜团,但是上面概述的基本问题(特别是关于getDefinitionByName的范围)仍然存在。我只是想发布一个我能解决的答案。
如果父级是系统域,则重新获取parentDomain会返回null。因此,尽管parentDomain是系统域,但parentDomain属性仍然返回null。就是那样子。不幸的是,这使得系统域不可访问,例如,通过getQualifiedDefinitionNames进行类枚举。
关于我的初始测试,似乎构造一个新的ApplicationDomain会创建一个失效的对象,直到将SWF实际加载到该域下为止。例如,创建当前域的子域并在其上调用hasDefinition将返回false,但是如果将同一实例分配给加载器上下文,并将其传递给Loader.load,则在加载完成后,可以在最初返回false的实例,它将返回true。因此,您可以与父级一起构造ApplicationDomain,但是只有在积极使用它的情况下,它才真正起作用。
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。