Actionscript 3 flash.utils.getDefinitionByName vs.ApplicationDomain';s类定义方法
这两个方法组在使用的类集(即ApplicationDomain的类定义集与getDefinitionByName使用的类定义集)方面有什么区别Actionscript 3 flash.utils.getDefinitionByName vs.ApplicationDomain';s类定义方法,actionscript-3,flash,reflection,applicationdomain,Actionscript 3,Flash,Reflection,Applicationdomain,这两个方法组在使用的类集(即ApplicationDomain的类定义集与getDefinitionByName使用的类定义集)方面有什么区别 应用领域//getQualifiedDefinitionNames(仅限Flash Player 11.3+版本,未记录) 很明显,存在应用程序域层次结构,定义可能在某些应用程序域中可见,而在其他应用程序域中不可见。例如,ApplicationDomain.getDefinition是否会返回一个在给定应用程序域中未定义但可从中访问的定义?(例如,如果
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?
这个页面相当全面:我已经设法解决了几个谜团,但上面概述的基本问题(特别是关于getDefinitionByName的范围)仍然存在。我只是想发布一个我能够解决的问题的答案 如果父域是系统域,则检索parentDomain将返回null。因此,尽管parentDomain是系统域,但parentDomain属性仍将返回null。事实就是这样。不幸的是,这使得系统域无法访问,例如,对于通过getQualifiedDefinitionNames进行的类枚举 关于我的初始测试,似乎构造一个新的ApplicationDomain会创建一个死对象,直到在该域下实际加载SWF为止。例如,创建当前域的子域并对其调用hasDefinition将返回false,但如果将同一实例分配给加载程序上下文,则将其传递给loader.load,加载完成后,可以对最初返回false的实例调用hasDefinition,它将返回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