samedi 1 septembre 2012

Réflexion


  • La réflexion
    • permet, par programmation, d'obtenir des informations sur un type de données chargé en mémoire.
    • dans le cas de Java, ce sont les constructeurs , les attributs, les méthodes de la classe étudiée.
    • Ces infos sont stockées dans une méta-classe : la classe Class
  • La classe objet fournit une méthode getClass()
  • classe Class :
    • permet d'accéder aux informations sur les classes.
      il existe un objet Class pour toute classe utilisée.
    • méthodes :
      • toString() = getName() + "class" ou "interface" selon le cas
      • newInstance() produit une nouvelle instance du type de l'objet
    • et surtout les méthodes permettant d'accéder aux caractéristiques des objets modélisés
      • getName() retourne le nom (String) de la classe
      • getSuperClass() renvoie des informations (de type Class) sur la super-classe de la classe
      • getPackage()
      • int getModifiers() de la classe
      • getSuperclass()
      • getInterfaces()
      • getConstructors()
      • getDeclaredFields() tous les attributs
      • getFields() uniquement ceux public
      • getMethods()
    • méthode de classe :
      • forName(String nom_de_classe)
        retourne un objet Class du nom de classe indiquée (package compris)
        si nécessaire, appelle le "classloader" en cours pour charger le fichier .class nécessaire dans la JVM
    • opérateur :
      objet instanceof classe retourne true si l'objet est appartient à cette classe (directement ou par héritage) 

Introspection d'un bean

Les IDEs (interface ...) permettent de manipuler aisément les objets et les classes : grace à l'introspection du langage Java, des "Explorers" visualise immédiatement les attributs, les méthodes ainsi que leur type, leur modifier d'accès et pour les méthodes leur signature. Qu'en est'il des caractéristiques des beans ?
Source de InspecteurProphet.java
package prophet3;
import java.beans.*;
class InspecteurProphet{
  public static void main(String args[]) {
    Prophete prophete = new Prophete("Brian");
    System.out.println ("Inspection de "
                        + prophete.getClass().getName() +"\n");
    try {
      BeanInfo bi =  Introspector.getBeanInfo (prophete.getClass());
      System.out.println ("getBeanInfo ShortDescription : " 
                     +  bi.getBeanDescriptor().getShortDescription() + "\n");      
      EventSetDescriptor[] esd = bi.getEventSetDescriptors();
      System.out.println ("EventSetDescriptor : \n");
      for (int i=0;i<esd.length;i++)
   System.out.print ("  " + esd[i].getName() + " ");
      System.out.println ("\n");
      
      PropertyDescriptor pd[] = bi.getPropertyDescriptors();
      System.out.println ("PropertyDescriptor : \n");
      for (int i=0;i<pd.length;i++)
   System.out.print ("  " + pd[i].getName() + " ");
      System.out.println ("\n");
      
      MethodDescriptor md[] = bi.getMethodDescriptors();
      System.out.println ("MethodDescriptor : \n");
      for (int i=0;i<md.length;i++)
   System.out.print ("  " + md[i].getName() + " ");
      System.out.println ("\n");   
    } catch (IntrospectionException e) {
      System.out.println ("impossible de trouver le BeanInfo de "
      + prophete.getClass().getName() + "\n"
      + e.getMessage());
    }   
  }
}

Aucun commentaire:

Enregistrer un commentaire