动态加载SWC文件

动态加载SWC文件

在项目中,我们为了分离模块或者模块间共用类库...
经常会使用加载模块/类库再使用反射的方式获取所需要类进行使用..

一般常用的是直接用loader加载swf文件,或者使用rsl加载swz或者swf...

今天说的是另一种方法...我们将直接加载"SWC"...
SWC是库项目所编译而成文件...
一般的使用方法是在其它项目中引入所需的库然后使用并打包在自己的项目中...

其实大家都知道SWC实际上只是一个压缩包...
拖到解压缩软件里就可以看到它包含了一个描述该库所带的类与相应的方法的XML文件catalog.xml与一个library.swf...
我们可以直接使用loader加载library.swf以获取该库的类...

那么既然SWC本身就是一个压缩包的话...我们也可以运行时对它进行解压缩...
动态提取library.swf再进行加载工作...
省去不必要的人工操作...
思路大概就是这样...

package
{
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.ByteArray;
import flash.utils.getDefinitionByName;

import nochump.util.zip.ZipEntry;
import nochump.util.zip.ZipFile;

[SWF(backgroundColor="#CCCCCC")]
public class loadSWCExample extends Sprite
{
private var _output:TextField;
public function loadSWCExample()
{
var tf:TextFormat = new TextFormat("Verdana",12,0x333333);
tf.leading = 6;

_output = new TextField();
_output.defaultTextFormat = tf;
_output.background = true;
_output.x = 10;
_output.y = 10;
_output.width = 480;
_output.height = 380;
addChild(_output);

_output.appendText("开始加载 MyLib.swc\n");
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE,swcLoaded);
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.load(new URLRequest("MyLib.swc"));
}
private function swcLoaded(e:Event):void
{
_output.appendText("开始解压 MyLib.swc\n");
var byte:ByteArray = e.target.data;
byte = swc2swf(byte);
_output.appendText("成功解压 MyLib.swc, 获取文件 library.swf\n");

_output.appendText("开始加载 library.swf\n");
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,libReady);
loader.loadBytes(byte,new LoaderContext(false,ApplicationDomain.currentDomain));
}
private function libReady(e:Event):void
{
_output.appendText("获取类 net.l4cd.swc::MyClass\n");
var Cl:Class = getDefinitionByName("net.l4cd.swc::MyClass") as Class;
var obj:Object = new Cl();

_output.appendText("执行 test():\n");
_output.appendText(obj.test());
}
private function swc2swf(byte:ByteArray):ByteArray
{
var zipFile:ZipFile = new ZipFile(byte);
var zipEntry:ZipEntry = zipFile.getEntry("library.swf");
return zipFile.getInput(zipEntry)
}
}
}
MyClass:
package net.l4cd.swc
{
public class MyClass
{
public function test():String
{
return "此文本由 net.l4cd.swc::MyClass.test() 返回";
}
}
}


PS:此方法用到nochump的zip库,请自行下载

posted @ 2012-10-04 16:55  Lunaa  阅读(233)  评论(0编辑  收藏  举报