如何将库中的 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();