flash.utils.getDefinitionByName与ApplicationDomain的类定义方法

时间:2014-03-31 17:04:17

标签: actionscript-3 flash reflection applicationdomain

这两个方法组之间的区别在于它们使用的类集(即ApplicationDomain的类定义集与类定义集合getDefinitionByName使用的对象)?

  1. ApplicationDomain中。 getDefinition / hasDefinition / getQualifiedDefinitionNames(仅限Flash Player 11.3+,未记录)
  2. getDefinitionByName
  3. 很清楚,有一个应用程序域层次结构,这些定义可能在某些应用程序域中可见,而在其他域中则不可见。例如,ApplicationDomain.getDefinition会返回一个未在给定应用程序域中定义但可从其中访问的定义吗? (例如,如果域是子域,并且我们正在查找父域中定义的定义?)ApplicationDomain的文档只是说"加载类只有在它们的父级尚未定义时才定义他们&#34。但它也说"(ApplicationDomains)允许存在同一类的多个定义,并允许子项重用父定义。"

    文档还指出getDefinitionByName返回 class 定义,而ApplicationDomain.getDefinition除了类定义外还将返回 namespace function 定义。

    假设我只对类定义感兴趣,那么ApplicationDomains会对getDefinitionByName进行搜索吗? (例如,所有域,仅当前/呼叫者域,还是呼叫者可访问的任何域?)

    这个初步测试令人困惑:

    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报告在当前app域中只定义了主时间轴类,但getDefinition对DisplayObject返回true,表明它报告了父(系统)域中定义的存在但是孙子领域的最终痕迹与返回虚假的内容相矛盾。

    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?
    

1 个答案:

答案 0 :(得分:2)

这个页面非常全面:http://www.senocular.com/flash/tutorials/contentdomains/?page=2我设法解决了一些谜团,但上面概述的基本问题(特别是关于getDefinitionByName的范围)仍然存在。我只是想回答一下我能够解决的问题。

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

关于我的初始测试,似乎构建一个新的ApplicationDomain会创建一个死对象,直到SWF实际加载到该域下。例如,创建当前域的子域并在其上调用hasDefinition将返回false,但是如果将该非常相同的实例分配给加载器上下文并将其传递给Loader.load,则一旦加载完成,您可以调用hasDefinition on最初返回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。