flashdll介绍:
http://www.flashdll.org
昨天问胡矿关于flashdll的内容时,胡矿提出了一个问题“如果两个类名包名完全相同的类分别编译到两个SWF中,然后在加载完成后是否存在反射出的类有覆盖的问题”,我就此做了一个测试。
1.
建立两个lib project 分别为 DLLSWCA和DLLSWCB,它们都有一个com.flashdll.test.OverrideDLLTestSWC,包名,路径,路径完全相同,都有一个方法output(),唯一的不同就是这两个方法中trace不同的字符串用于区分它们是处于两个不同的swf中。将这两个lib porject发布出对应的swc。代码如下:
2.
建立两个as proj分别把刚才的两个swc编译到swf,这俩个as项目的主类没有任何其他代码。编译参数写 -include-libraries DLLSWCA.swc或-include-libraries DLLSWCB.swc,最后发布。生成出来的 两个swf分别带有两个swc的OverrideDLLTestSWC类 ,作为DLL有loader加载。
3.
建立一个测试as 项目 名字任意,将第一步生成的swc导入到lib path中,注意要将这两个swc 的 linktype设为 External这样 swc中的代码才不会编译到 主swf中,否则dll就没意义了 。但是 代码提示和语法检查还是起效的。
然后在 项目主类中 写如下代码:
package
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.utils.*;
import org.flashdll.DLLLoader;
//用于语法检查和代码提示,并不会编译到swf
import com.flashdll.test.OverrideDLLTestSWC;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
[SWF(width='600', height='600', frameRate='24')]
public class ModuleTest extends Sprite
{
public function ModuleTest()
{
stage.align=StageAlign.TOP_LEFT;
stage.scaleMode=StageScaleMode.NO_SCALE;
var loader : DLLLoader = new DLLLoader(this);
loader.addEventListener(DLLLoader.ALL_COMPLETED, this.__onLoadInit);
//设置加载dll的顺序
loader.addDLL("DLLSWFA.swf", "library1");
loader.addDLL("DLLSWFB.swf", "library2");
loader.notify();
}
private function __onLoadInit(e:Event):void
{
var libclass:Object=getDefinitionByName("com.flashdll.test.OverrideDLLTestSWC");
var lib:OverrideDLLTestSWC = new libclass();
lib.output();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
}
编译执行,
lib.output();执行结果为 输出 :THIS IS THE A DLL。
把 loader.addDLL("DLLSWFA.swf", "library1");和 loader.addDLL("DLLSWFB.swf", "library2"); 对调执行顺序 也就是先加载dllb 再加载dllb。重新编译,那么 , lib.output();执行结果为 输出 :THIS IS THE B DLL。
结论:
如果不同的dll里有类名和路径完全相同的类,那么 先被加载dll中类对象被缓存了起来,以后加载的dll的 类名和路径完全相同 类对象就不会覆盖了之前的这个类对象。
昨天问胡矿关于flashdll的内容时,胡矿提出了一个问题“如果两个类名包名完全相同的类分别编译到两个SWF中,然后在加载完成后是否存在反射出的类有覆盖的问题”,我就此做了一个测试。
1.
建立两个lib project 分别为 DLLSWCA和DLLSWCB,它们都有一个com.flashdll.test.OverrideDLLTestSWC,包名,路径,路径完全相同,都有一个方法output(),唯一的不同就是这两个方法中trace不同的字符串用于区分它们是处于两个不同的swf中。将这两个lib porject发布出对应的swc。代码如下:
//
dllswca的类代码
package com.flashdll.test
{
public class OverrideDLLTestSWC
{
public function OverrideDLLTestSWC()
{
}
public function output(): void
{
trace( " THIS IS THE A DLL " );
}
}
}
package com.flashdll.test
{
public class OverrideDLLTestSWC
{
public function OverrideDLLTestSWC()
{
}
public function output(): void
{
trace( " THIS IS THE A DLL " );
}
}
}
//
dllswcb的类代码
package com.flashdll.test
{
public class OverrideDLLTestSWC
{
public function OverrideDLLTestSWC()
{
}
public function output(): void
{
trace( " THIS IS THE B DLL " );
}
}
}
package com.flashdll.test
{
public class OverrideDLLTestSWC
{
public function OverrideDLLTestSWC()
{
}
public function output(): void
{
trace( " THIS IS THE B DLL " );
}
}
}
2.
建立两个as proj分别把刚才的两个swc编译到swf,这俩个as项目的主类没有任何其他代码。编译参数写 -include-libraries DLLSWCA.swc或-include-libraries DLLSWCB.swc,最后发布。生成出来的 两个swf分别带有两个swc的OverrideDLLTestSWC类 ,作为DLL有loader加载。
3.
建立一个测试as 项目 名字任意,将第一步生成的swc导入到lib path中,注意要将这两个swc 的 linktype设为 External这样 swc中的代码才不会编译到 主swf中,否则dll就没意义了 。但是 代码提示和语法检查还是起效的。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/afvbmp/linktype.png)
然后在 项目主类中 写如下代码:
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
把 loader.addDLL("DLLSWFA.swf", "library1");和 loader.addDLL("DLLSWFB.swf", "library2"); 对调执行顺序 也就是先加载dllb 再加载dllb。重新编译,那么 , lib.output();执行结果为 输出 :THIS IS THE B DLL。
结论:
如果不同的dll里有类名和路径完全相同的类,那么 先被加载dll中类对象被缓存了起来,以后加载的dll的 类名和路径完全相同 类对象就不会覆盖了之前的这个类对象。