Reflexão ou Instrospecção em Adobe Flex / ActionScript
Autor: alessandro.moreira | Publicado: 2009-01-21T04:07:00-08:00

Antes de iniciar, gostaria de parabenizar dois profissionais, os quais têm sido uma referência nesta fase inicial dos meus estudo em Flex e ActionScript. Ambos atendem prontamente quando solicitamos, sempre muito atenciosos e detalhistas em suas respostas, o que ajuda e muito, além de passar uma grande confiança. E ressalto o trabalho que desenvolvem através de seus sites e fórum. São eles: Mário Santos, da msdevstudio.com e o Julio da flexpernambucano.com.br. Queria aproveitar este meu primeiro post sobre Flex e Actionscript para de público agradecer e parabenizar aos dois. Obrigado!Mas vamos ao post!!Reflexão ou introspecção é a capacidade de um programa de investigar fatos sobre si próprio. É uma técnica para determinar os elementos de uma classe em tempo de execução, tais como suas propriedades e métodos. Existem duas maneiras de fazer instrospecção em Actionscript.A primeira maneira é usando o laço for..in. Esta técnica somente funciona para objetos dinâmicos, poisela enumera apenas as propriedades adicionadas dinamicamente. Ou seja, variáveis e métodos declarados não são enumerados em laços for..in. Veja exemplo:&lt;?xml version="1.0"?&gt;&lt;!-- IntrospectionForIn.mxml --&gt;&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()"&gt;&lt;mx:Script&gt;&lt;![CDATA[   private var obj:Object = new Object();    private function initApp():void {      // propriedades adicionadas dinamicamente.      obj.a = "Schotten Totten";      obj.b = "Taj Majal";      obj.c = "Durche die Wuste";      }    public function dumpObj():void {      for (var p:String in obj) {         ta1.text += p + ":" + obj[p] + "\n";      }   }]]&gt;&lt;/mx:Script&gt;&lt;mx:TextArea id="ta1" width="400" height="200"/&gt;&lt;mx:Button label="Dump Object" click="dumpObj()"/&gt;&lt;/mx:Application&gt;Exemplo retirado da documentação da adobe Flex.A segunda maneira é usando a API de Instrospecção. Ela é apropriada quando se quer listar todas as propriedades e métodos públicos de uma classe não-dinâmica. Aqui destaco o método flash.utils.describeType(), o qual retorna um XML com a descrição da classe (E4X API). Veja exemplo:&lt;?xml version="1.0"?&gt;&lt;!-- IntrospectionAPI.mxml --&gt;&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="getDetails()"&gt;    &lt;mx:Script&gt;&lt;![CDATA[        import flash.utils.*;        public function getDetails():void {             // Fornece a descrição do Botão em E4X XML.            var classInfo:XML = describeType(button1);            // Lista o nome da classe.            ta1.text = "Class " + classInfo.@name.toString() + "\n";            // Lista as variáveis do objeto, seus valores e seus respectivos tipos.            for each (var v:XML in classInfo..variable) {                ta1.text += "Variable " + v.@name + "=" + button1[v.@name] + " (" + v.@type + ")\n";            }            // Lista os acessores como propriedades.            for each (var a:XML in classInfo..accessor) {                // Não fornece o valor da propriedade se for "write only".                if (a.@access == 'writeonly') {                    ta1.text += "Property " + a.@name + " (" + a.@type +")\n";                }                else {                    ta1.text += "Property " + a.@name + "=" + button1[a.@name] +  " (" + a.@type +")\n";                }            }             // Lista os métodos do objeto.            for each (var m:XML in classInfo..method) {                ta1.text += "Method " + m.@name + "():" + m.@returnType + "\n";            }        }    ]]&gt;&lt;/mx:Script&gt;    &lt;mx:Button label="This Button Does Nothing" id="button1"/&gt;    &lt;mx:TextArea id="ta1" width="400" height="200"/&gt;&lt;/mx:Application&gt;Exemplo retirado da documentação da adobe Flex.Saiba mais nas referências abaixo.Referências1. http://livedocs.adobe.com/flex/3/html/help.html?content=usingas_8.html2. http://jsatriani.wordpress.com/2008/06/10/introspeccao-performance-java-x-action-script3/3. http://www.as3dp.com/2007/05/05/runtime-checks-for-abstract-classes-and-methods-in-actionscript-30/