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

标签 actionscript-3 flash reflection applicationdomain

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

  1. 应用程序域。 getDefinition/hasDefinition/getQualifiedDefinitionNames(仅限 Flash Player 11.3+,未记录)
  2. getDefinitionByName

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

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

假设我只对类定义感兴趣,那么 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 property 无论如何都会返回 null。就是那样子。不幸的是,这使得系统域无法访问,例如,对于通过 getQualifiedDefinitionNames 进行的类枚举。

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

关于actionscript-3 - flash.utils.getDefinitionByName 与 ApplicationDomain 的类定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22767776/

相关文章:

ios - AS3 将 SWF 保存到 iOS 设备,然后将其加载回 MovieClip

php - AS3动态数据加载不正确

actionscript-3 - 任何 Haxe GC 提示?

xml - 将 Flash (AS3) 数据保存到 XML

JavaScript/Flash : When exactly are flash external callback methods triggered?

c# - 如何将依赖项注入(inject)动态加载的程序集

java - Reflection + AOP - 通过调用调用方法时未拦截通知

java - Kotlin:具体化的泛型似乎不适用于散列/等于比较

actionscript-3 - as3 textField vs label vs textArea

actionscript-3 - 何时子类化以及何时使用现有类?