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)
developpement, flex
actionscript 3, flex