FlashDLL小测试

flashdll介绍: http://www.flashdll.org

昨天问胡矿关于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 " );
        }
    }
}
// dllswcb的类代码
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就没意义了 。但是 代码提示和语法检查还是起效的。

然后在 项目主类中 写如下代码:
package   {

    
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; 

    [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();
        }


    }
 
}

编译执行, 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的
类名和路径完全相同 类对象就不会覆盖了之前的这个类对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值