Home > developpement, flex > Introspection en Flex ou ActionScript, utilisation de l’API de reflection

Introspection en Flex ou ActionScript, utilisation de l’API de reflection

février 27th, 2009

Il est parfois utile d’avoir à déterminer les caractéristiques d’un objet (méthodes, attributs) ou bien de vouloir instancier de manière dynamique un objet à partir d’un code générique. Pour cela on utilise un mécanisme appelé l’introspection ou Reflection.

Tous les languages de haut niveau proposent ce type de fonctionnement et Actionscript ne déroge pas à la règle. Il y a cependant certaines subtilités à connaitre afin de faire fonctionner l’introspection en ActionScript.

L’utilisation de l’introspection en ActionScript passe par l’utilisation des fonctions disponibles dans le package flash.utils. Nous allons étudier par la suite deux de ces fonctions en détails, celle permettant de déterminer les caractéristiques d’un objet et celle permettant de faire des instanciation dynamique.

Déterminer dynamiquement les caractéristiques d’un objet

Pour déterminer de manière dynamique les caractéristiques d’un objet, il faut utiliser la fonction describeType dont voici la signature :

function describeType(value:*):XML

Cette fonction prend en paramètre tout type d’objet (* signifiant type indéfini) et retourne un XML décrivant la classe.

Instancier dynamiquement un objet

Pour intancier dynamiquement un objet il faut utiliser la méthode getDefinitionByName dont voici la signature :

getDefinitionByName(name:String):Object

Cette fonction retourne une référence de la classe (un pointeur) définie par la chaine de caractère passée en paramètre (le paramètre name).

Prenons tout de suite un exemple. Si on veut instancier de manière dynamique un objet Flex Button le code sera le suivant :

import mx.controls.*;
try{
var myClass:Class = getDefinitionByClassName(”mx.controls.Button”);
}catch(error:Error){
trace(error.message);
}
var myObject:* = new myClass();

Avec ce code on retrouve dans la variable myObject une instance de la classe Flex Button. Ce code compile parfaitement mais malheureusement à ne fonctionne pas à l’execution et générer l’erreur 1065 (variable n’est pas définie). En effet dans ce code, le moteur flash n’embarque à aucun moment la définition de la classe Button car il n’existe aucune variable faisant référence à la classe Button. Pour que le code fonctionne il faut donc créer une variable “bidon” faisant référence à la classe Button pour que le moteur flash l’embarque.
Le code devient donc :

import mx.controls.*;
try{
// hack pour permettre à l’introspection de fonctionner
var buttonBidon:Button;
var myClass:Class = getDefinitionByClassName(”mx.controls.Button”);
}catch(error:Error){
trace(error.message);
}
var myObject:* = new myClass();

Avec l’ajout de cette variable le code fonctionne parfaitement et la variable myObject devient utilisable.

En conclusion, l’introspection est parfaitement fonctionnelle et utilisable en ActionScript. Elle nécessite cependant quelques astuces indispensable.

VN:F [1.0.8_357]
Rating: 3.7/5 (3 votes cast)
Partager et découvrir : Ces icônes sont des liens vers des sites de partage de signet sociaux où les lecteurs peuvent partager et découvrir de nouveaux liens.
  • Digg
  • del.icio.us
  • StumbleUpon
  • Reddit
  • Webnews
  • MisterWong
  • Y!GG
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • MySpace
  • Technorati
  • Wikio

developpement, flex ,

  1. Maskime
    juillet 12th, 2010 at 14:29 | #1

    Parfaitement fonctionnelle et utilisable…
    Je vois pas franchement l’intérêt de l’introspection si on doit savoir à l’avance ce qu’on va instancier…

    VA:F [1.0.8_357]
    Rating: 0.0/5 (0 votes cast)
  1. No trackbacks yet.