这两个方法组在它们使用的类集(即ApplicationDomain 的类定义集与getDefinitionByName 使用的类定义集)方面有什么区别?
- 应用程序域。getDefinition / hasDefinition / getQualifiedDefinitionNames(仅限 Flash Player 11.3+,未记录)
- 按名称获取定义
很明显,存在应用程序域层次结构,并且定义可能在某些应用程序域中可见,而在其他应用程序域中不可见。例如,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?