如何将库中的 item/classes 加载到字典中?
How to load item/classes in library to a dictionary?
在不为图书馆中的项目名称创建列表的情况下,是否可以自动获取项目名称并将其加载到字典中?
目前我正在做的是,第一次使用来自 greensock 的 DataLoader 加载 swf
var contentLoader:DataLoader = new DataLoader('s_res.swf', {onComplete:completeHandler, format:'binary' } )
然后在获取内容后,我使用 flassari
中的 swfclassexplorer
传入我得到的二进制数据
private static var list:Array;
public function setup($byeArray:ByteArray):void
{
ba = $byeArray;
var _loader:Loader = new Loader();
var loaderContext:LoaderContext = new LoaderContext();
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
_loader.loadBytes(ba, loaderContext);
}
private function completeHandler($e:Event):void
{list = SwfClassExplorer.getClassNames(ba);}
从这里我可以获得一个名称列表,我也可以使用 Loadermax 获取文件
for (var i:int = 0; i < list.length; i++)
{
var _class:Class = (LoaderMax.getLoader("mcA").getClass(list[i])) as Class;
}
从这里看起来一切都很好,但我觉得这可能不是最直接的做法,因为它必须通过另一个加载程序来获取文件名,然后循环列表以将项目添加到1乘1
根据给定的 link 到 swfclassexplorer,您应该能够切换到 SWF 的上下文并针对列出的每个 class 调用 flash.utils.getDefinitionByName()
es。每次调用的结果将是一个 Class
对象,然后将其填充到字典中。如果你深入研究 flash.display.Loader
class 和应用程序域上下文,你也可以摆脱所有框架。
private var list:Vector.<String>;
private var dict:Dictionary=new Dictionary(); // here you want classes
var loader:Loader=new Loader();
var url:URLRequest = new URLRequest("s_res.swf");
var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null);
loader.addEventListener(Event.COMPLETE,setup);
loader.load(url, loaderContext);
function setup(e:Event):void {
var loader:Loader=e.target as Loader;
var ad:ApplicationDomain=loader.contentLoaderInfo.applicationDomain;
list=ad.getQualifiedDefinitionNames();
// here you get all class definitions
for each (var s:String in list) dict[s]=flash.utils.getDefinitionByName(s);
// fill the dictionary
}
也许有更多的驼峰,但实际上应该如此。
显然使用 greensock 中的 swfloader 这会起作用。
var ad:ApplicationDomain = $swfLoader.rawContent.loaderInfo.applicationDomain;
list = ad.getQualifiedDefinitionNames();
在不为图书馆中的项目名称创建列表的情况下,是否可以自动获取项目名称并将其加载到字典中?
目前我正在做的是,第一次使用来自 greensock 的 DataLoader 加载 swf
var contentLoader:DataLoader = new DataLoader('s_res.swf', {onComplete:completeHandler, format:'binary' } )
然后在获取内容后,我使用 flassari
中的 swfclassexplorer传入我得到的二进制数据
private static var list:Array;
public function setup($byeArray:ByteArray):void
{
ba = $byeArray;
var _loader:Loader = new Loader();
var loaderContext:LoaderContext = new LoaderContext();
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
_loader.loadBytes(ba, loaderContext);
}
private function completeHandler($e:Event):void
{list = SwfClassExplorer.getClassNames(ba);}
从这里我可以获得一个名称列表,我也可以使用 Loadermax 获取文件
for (var i:int = 0; i < list.length; i++)
{
var _class:Class = (LoaderMax.getLoader("mcA").getClass(list[i])) as Class;
}
从这里看起来一切都很好,但我觉得这可能不是最直接的做法,因为它必须通过另一个加载程序来获取文件名,然后循环列表以将项目添加到1乘1
根据给定的 link 到 swfclassexplorer,您应该能够切换到 SWF 的上下文并针对列出的每个 class 调用 flash.utils.getDefinitionByName()
es。每次调用的结果将是一个 Class
对象,然后将其填充到字典中。如果你深入研究 flash.display.Loader
class 和应用程序域上下文,你也可以摆脱所有框架。
private var list:Vector.<String>;
private var dict:Dictionary=new Dictionary(); // here you want classes
var loader:Loader=new Loader();
var url:URLRequest = new URLRequest("s_res.swf");
var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null);
loader.addEventListener(Event.COMPLETE,setup);
loader.load(url, loaderContext);
function setup(e:Event):void {
var loader:Loader=e.target as Loader;
var ad:ApplicationDomain=loader.contentLoaderInfo.applicationDomain;
list=ad.getQualifiedDefinitionNames();
// here you get all class definitions
for each (var s:String in list) dict[s]=flash.utils.getDefinitionByName(s);
// fill the dictionary
}
也许有更多的驼峰,但实际上应该如此。
显然使用 greensock 中的 swfloader 这会起作用。
var ad:ApplicationDomain = $swfLoader.rawContent.loaderInfo.applicationDomain;
list = ad.getQualifiedDefinitionNames();