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, pois
ela 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:
<?xml version="1.0"?>
<!-- IntrospectionForIn.mxml -->
<mx:application creationcomplete="initApp()" xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:script><![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] "
";
}
}
]]></mx:script>
<mx:textarea height="200" id="ta1" width="400"/>
<mx:button click="dumpObj()" label="Dump Object"/>
</mx:application>
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:
<?xml version="1.0"?>
<!-- IntrospectionAPI.mxml -->
<mx:application creationcomplete="getDetails()" xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:script><![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() "
";
// 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 ")
";
}
// 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 ")
";
}
else {
ta1.text = "Property " a.@name "=" button1[a.@name] " (" a.@type ")
";
}
}
// Lista os métodos do objeto.
for each (var m:XML in classInfo..method) {
ta1.text = "Method " m.@name "():" m.@returnType "
";
}
}
]]></mx:script>
<mx:button id="button1" label="This Button Does Nothing"/>
<mx:textarea height="200" id="ta1" width="400"/>
</mx:application>
Exemplo retirado da documentação da adobe Flex.
Saiba mais nas referências abaixo.
Referências
- http://livedocs.adobe.com/flex/3/html/help.html?content=usingas_8.html
- http://jsatriani.wordpress.com/2008/06/10/introspeccao-performance-java-x-action-script3/
- http://www.as3dp.com/2007/05/05/runtime-checks-for-abstract-classes-and-methods-in-actionscript-30/
Autor: Alessandro Moreira
Tags: Reflexão, Instrospecção, Adobe Flex, Flex





