Bom, hoje vou falar um pouco de um recurso muito importante no desenvolvimento de aplicações, que é o processo pelo qual se pode obter informações sobre a estrutura e comportamento do programa em tempo de execução, de uma maneira estreitamente dependente das características de abstração do código, ou seja, o programa tem a habilidade para “observar” e possivelmente modificar a estrutura e comportamento. Levando em consideração esse conceito vou mostrar como esse pode ser aplicado tanto na linguagem Java como em ActionScript3(AS3).
Em AS3 ultilizada no desenvolvimento Flex, reflexão é referenciada como object introspection (introspecção de Objeto). Existem duas formas de introspecção em AS3: Usando o laço for…in e a API introspecção. Em Java esta atividade é auxiliada pelo pacote java.lang.reflect. É bom deixar bem claro que a API introspecção em ActionScript não é tão avançada como em Java, porem permite você ler métodos, propriedades e invocar métodos de objetos em tempos de execução, tao bem quanto. Bom, chega de conversa e mãos a obra.
Para nosso exemplo vamos definir nossa classe que ira servir como base para fazer nossos testes, precisamos de duas classes uma em Java .class e outra em ActionScript .as:
Vamos por parte, primeiramente aprender como pegar a definição de classe e logo em seguida criar uma instancia da mesma, primeiro em Java:
...
Class classePessoa = Class.forName(”Pessoa”);
Object instance = classePessoa.newInstance();
…Muito fácil não? Em ActionScript é mais fácil ainda, com a utilização do método getDefinitionByName() definido em flash.utils, onde contem diversas funções de manipulação de classes e objetos em tempo de execução, podemos criar uma definição de classe.
...
var classePessoa: Class = getDefinitionByName(”Pessoa”) as Class;
var instance = new classePessoa ();
…Agora Vamos tentar recuperar a estrutura do Objeto Pessoa em tempo de execução, primeiro em Java:
Class classePessoa = Class.forName("Pessoa");
String str=”";
for (Field field : classePessoa.getDeclaredFields()) {
str+=”Variaveis: “+
field.getName()+
“=(”+field.getType().getSimpleName()+
“)”+
“\n”;
}
for (Method method : classePessoa.getDeclaredMethods()) {
str+=”Metodo: “+
method.getName()+
“=(”+method.getReturnType()+
“)”+
“\n”;
}
System.out.println(str);Agora o processo em ActionScript, é feito com a utilização do for..in e a função describeType() que vem também no pacote flash.utils, recebe como parâmetro o objeto a ser introspectivo sobre um retorno descrito em XML do tipo do objeto e toda sua estrutura:
var ClassePessoa:Class = getDefinitionByName(”Pessoa”) as Class;
var classInfo:XML = describeType(classePessoa);
var str:String=”;
for each (var v:XML in classInfo..variable) {
str += “Variavel: ” + v.@name + “=” + ” (” + v.@type + “)\n”; }
for each (var v:XML in classInfo..method) {
str += “Metodo: ” + v.@name + “=” + ” (” + v.@returnType + “)\n”;
}
trace(str);Abas imprimem o seguinte trace:
Variavel : nome=(String)
Variavel : nacionalidade=(String)
Variavel : idade=(String)
Metodo: falar=(void)
Metodo: ouvir=(void)
Outra coisa muito utilizada quando se utiliza reflexão e invocação de métodos por definição explicita de assinatura e parâmetro, em Java podemos criar um objeto Method a partir do getMethod() passando o nome do método como parâmetro, e em seguida utilizar seu método invoke() , passando o objeto, e parâmetro, no argumento:
...
Class classePessoa = Class.forName(”Pessoa”);
Method m = classePessoa.getMethod(”falar”, null);
m.invoke(classePessoa.newInstance(), null);
…Em ActionScript é um pouco diferente, pois o tipo Object é uma classe dinâmica então não precisamos fazer o hard-code do método para que o metodo seja invocado, basta fazer instanciar com new e invocar explicitamente.
var classePessoa:Class = getDefinitionByName("Pessoa") as Class;
var instance:Object = new classePessoa()
instance["falar"](); // ou instance.falar(); os dois sao equivalentes
Um outro método muito utilizado na introspecção AS3 é o getClassInfo(), no qual retorna um objeto com nome e propriedades do mesmo e o toString() que retorna uma espécie de “mapa” do Objeto, todos dois da classe ObjetoUtils.
...
var o:Object = ObjectUtil.getClassInfo(Pessoa);
trace(ObjectUtil.toString(o));
…Bom, espero ter colaborado para um entendimento do que vem a ser introspecção de objetos e como se comporta em cada uma das linguagens, tanto em Java quando em AS3, podendo ser uma técnica poderosa no desenvolvimento de soluções um tanto quanto genéricas.

0 Respostas para “Introspecção Performance: Java x ActionScript3”