Actionscript 3 flash.utils.getDefinitionByName vs.ApplicationDomain';s类定义方法

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是否会返回一个在给定应用程序域中未定义但可从中访问的定义?(例如,如果

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

  • 应用领域//getQualifiedDefinitionNames(仅限Flash Player 11.3+版本,未记录)
  • 很明显,存在应用程序域层次结构,定义可能在某些应用程序域中可见,而在其他应用程序域中不可见。例如,ApplicationDomain.getDefinition是否会返回一个在给定应用程序域中未定义但可从中访问的定义?(例如,如果域是子域,并且我们正在查找父域中定义的定义?)ApplicationDomain的文档只说“只有当其父域尚未定义加载的类时才定义它们。”但它也说“(ApplicationDomains)允许同一类的多个定义存在,并允许子类重用父定义。“

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

    假设我只对类定义感兴趣,那么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报告当前应用程序域中仅定义了主时间线类,而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