2012-02-23 73 views
2

我有主要應用程序,其中包含ModuleManager。這個應用程序加載了不同的模塊。主應用程序和加載的模塊都使用我的自定義RSL。我需要在我的RSL中獲取Class對象,這是在其中一個模塊中定義的。我試圖使用getDefinitionByName函數,但由於我的類沒有在RSL中定義,所以我得到一個異常(雖然加載了需要的類的模塊)。是否可以使模塊類對RSL代碼可見並在運行時獲取它的實例而不更改項目結構?謝謝getDefinitionByName()和類的可見性

+0

我認爲你需要在你的類的頂部'getDefinitionByName添加'import'聲明'去工作。 – 2012-02-23 11:35:37

+0

@Laurent我的RSL不知道模塊的任何信息,編譯時無法使用它 – 2012-02-23 11:38:56

+0

也許您正在將模塊加載到錯誤的應用程序域中,以便使用RSL中的getDefinitionByName進行訪問。這是有道理的,每個模塊被加載到一個獨特的一個,以避免類衝突。 – 2012-02-23 12:54:57

回答

1

如果您在類型Class的Module(或其接口)上公開某個屬性,則可以注入該類的定義,類似於將類定義注入按鈕以製作圖標。

所以,你的模塊可能有這樣的代碼:

protected var _classToMake:Class; 

public function get classToMake():Class { 
    return _classToMAke; 
} 

public function set classToMake(value:Class):void { 
    if (value != _classTomake) { 
     if (value != null) { 
     //test to make sure we're making the right thing 
     var testClass:SomeType = new value() as SomeType; 
     if (testClass != null) { 
      _classToMake = value 
     } else { 
      trace('classToMake must be a definition that makes a class of SomeType'); 
     } 
     } 
    } 
} 
1

當加載一個新模塊,指定的應用程序域。正如文檔所述:

"The ApplicationDomain class is a container for discrete groups of class definitions." 

您在加載SWF時指定應用程序域作爲加載程序上下文的一部分。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/ApplicationDomain.html

一旦你的模塊中加載到應用程序域的引用,你可以調用應用程序域的getDefinition()方法來獲取定義,在大致相同的方式作爲getDefinitionByName()

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/ApplicationDomain.html#getDefinition()

另請參見下面的文檔「使用應用程序域」,以瞭解它們的工作原理。

http://help.adobe.com/en_US/as3/dev/WSd75bf4610ec9e22f43855da312214da1d8f-8000.html

而這裏的例子的複製粘貼,只是櫃面就是跑開了:

package 
{ 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.events.*; 
    import flash.net.URLRequest; 
    import flash.system.ApplicationDomain; 
    import flash.system.LoaderContext; 

    public class ApplicationDomainExample extends Sprite 
    { 
     private var ldr:Loader; 
     public function ApplicationDomainExample() 
     { 
      ldr = new Loader(); 
      var req:URLRequest = new URLRequest("Greeter.swf"); 
      var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); 
      ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 
      ldr.load(req, ldrContext);  
     } 
     private function completeHandler(event:Event):void 
     { 
      var myGreeter:Class = ApplicationDomain.currentDomain.getDefinition("Greeter") as Class; 
      var myGreeter:Greeter = Greeter(event.target.content); 
      var message:String = myGreeter.welcome("Tommy"); 
      trace(message); // Hello, Tommy 
     } 
    } 
}