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就没意义了 。但是 代码提示和语法检查还是起效的。
然后在 项目主类中 写如下代码:
编译执行, 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的类名和路径完全相同类对象就不会覆盖了之前的这个类对象。