Le paquetage java.lang.reflect possèdent plusieurs classes et interfaces permettant de mettre en oeuvre le mécanisme d'introspection.

Les trois classes Field, Method et Constructor possèdent un modificateur final. La machine Virtuelle Java peut seulement créer des instances de ces classes. Ces objets sont utilisés pour manipuler les objets sous-jacents :

  • obtenir les informations d'introspection à propos des constructeurs et membres sous-jacents,
  • obtenir et fixer les valeurs des champs,
  • invoquer les méthodes sur les objets ou les classes,
  • créer de nouvelles instances des classes.

La classe Array est également finale mais non-instanciable. Elle fournit des méthodes statiques qui permettent de créer de nouveaux tableaux et d'obtenir ou de fixer les éléments des tableaux.

Exemple [voir]
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Introspection {
  public static void main(String[] args) {
    if (args.length > 0){
      try {
        Class classe = Class.forName(args[0]);
        Field[] champs = classe.getDeclaredFields();
        Method[] methodes = classe.getDeclaredMethods();
        Constructor[] constructeurs = classe.getDeclaredConstructors();
        System.out.println("Les champs de la classe " + classe.getName());
        System.out.println("Num :\tChamp\tType");
        for(int i = 0; i < champs.length; i++){
          System.out.println(i + " :\t" + champs[i].getName() 
                                                   + "\t" + champs[i].getType());
        }
        System.out.println("\nLes méthodes de la classe " + classe.getName());
        System.out.println("Num :\tType de retour\tMethode\t"
                                                  + "Types des Parametres\tTypes des Exceptions");
        for(int i = 0; i < methodes.length; i++){
          System.out.print(i + " :\t" + methodes[i].getReturnType() 
                                                     + "\t" + methodes[i].getName() + "\t");
          afficherInfos(methodes[i], "getParameterTypes");
          System.out.print("\t");
          afficherInfos(methodes[i], "getExceptionTypes");
          System.out.println("");
        }
        System.out.println("\nLes constructeurs de la classe " + classe.getName());
        System.out.println("Num :\tConstructeur\tTypes des Parametres"
                                                    + "\tTypes des Exceptions");
        for(int i = 0; i < constructeurs.length; i++){
          System.out.print(i + " :\t" + constructeurs[i].getName() + "\t");
          afficherInfos(constructeurs[i], "getParameterTypes");
          System.out.print("\t");
          afficherInfos(constructeurs[i], "getExceptionTypes");
          System.out.println("");
        }
      }
      catch (ClassNotFoundException e) {
        e.printStackTrace();
        System.out.println("La classe n'a pu être déterminée dans la méthode main()!");
      }
    }
  }

  /**
* La méthode afficherInfos() permet d'afficher des informations relatives
* à l'objet passé en argument. Les informations sont extraites par rapport
* au nom d'une méthode, laquelle doit être un membre de l'objet précité.
*
* @param obj correspond à l'objet à partir duquel des
* informations doivent être extraites.
* @param methode correspond à une méthode de l'objet et
* est destinée à extraire des informations.
*/
public static void afficherInfos(Object obj, String methode){ try { Object types = obj.getClass().getMethod(methode, null).invoke(obj, null); Class[] tabTypes = (Class[])types; for(int i = 0; i < tabTypes.length; i++){ System.out.print(i > 0 ? ", " : "\t"); System.out.print(tabTypes[i].getName()); } } catch (Exception e) { e.printStackTrace(); System.out.println("Une exception a été lancée dans la méthode afficherInfos() !"); } } }