getDefinitionByName () и видимость класса - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть основное приложение, которое содержит ModuleManager.Различные модули загружаются этим приложением.И основное приложение, и загруженные модули используют мой пользовательский RSL.Мне нужно получить объект Class в моем RSL, который определен в одном из модулей.Я пытаюсь использовать функцию getDefinitionByName, но поскольку мой класс не определен в RSL, я получаю исключение (хотя загружен модуль с необходимым классом)Можно ли сделать классы модулей видимыми для кода RSL и получить его экземпляр во время выполнения без изменения структуры проекта?Спасибо

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

При загрузке нового модуля укажите домен приложения.Как сказано в документе:

"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 
        } 
    } 
}
1 голос
/ 23 февраля 2012

Вы можете внедрить определение класса, если выставите свойство в модуле (или его интерфейсе) типа Class, подобно тому, как определения класса вводятся в кнопки для создания значков.

Итак, ваш модуль может иметь такой код:

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');
         }
      }
   }
}
...