Un objet Method représente une méthode réflêchie. La méthode sous-jacente peut être une méthode abstraite (modificateur abstract), une méthode d'instance (modificateur : private, protected et public) ou une méthode de classe (modificateur static).

Les méthodes de cette classe sont utilisées pour obtenir le type de chacun des paramètres, le type de retour et les types d'exceptions contrôlées de la méthode réflêchie.

Class classe = Class.forName(args[0]);
Method[] methodes = classe.getDeclaredMethods();

En outre, il est possible d'invoquer la méthode sous-jacente sur des objets cibles, par l'intermédiaire de la méthode invoke(). L'invocation de méthode abstraite et d'instance utilise une méthode de résolution dynamique fondée sur la classe d'exécution de l'objet cible et la classe de déclaration, le nom et le type des paramètres formels de la méthode. Ainsi, il est permis d'invoquer une méthode d'interface réflêchie sur un objet qui est une instance d'une classe qui implémente l'interface. L'invocation des méthodes statiques utilise la méthode statique sous-jacente de la classe de déclaration de la méthode.

import java.lang.reflect.Method;

public class Introspection {
  public static void main(String[] args) {
    try {
      Class classe = Class.forName("java.util.LinkedList");
      Object obj = classe.newInstance();
      Class[] types = {Integer.TYPE, Class.forName("java.lang.Object")};
      Object[] params = 
                                               {new Integer(0), "Une chaîne..."};
      Method methode = classe.getMethod("add", types);
      methode.invoke(obj, params);
      System.out.println(obj.toString());
    }
    catch (ClassNotFoundException e) {
      e.printStackTrace();
      System.out.println("La classe n'a pu être" 
                       + " déterminée dans la méthode main()!");
    }
  }
}

L'invocation d'une méthode nécessite de renseigner le nom et les valeurs de paramètres au sein de la méthode invoke(params). Les valeurs doivent correspondre aux types de paramètres énoncés lors de l'obtention de la méthode. Subséquemment, la méthode peut être invoquer par l'objet Method courant.

Class classe = Class.forName("java.util.Hashtable");
Object obj = classe.newInstance();
Class[] types = {
                                       Class.forName("java.lang.Object"), 
                                       Class.forName("java.lang.Object")
                               };
Object[] params = {new Integer(0), "Une chaîne..."};
Method methode = classe.getMethod("put", types);
methode.invoke(obj, params);

En outre, il est possible d'obtenir la classe de déclaration de la méthode par l'intermédiaire de la méthode getDeclaringClass(). Quant au nom ou à la représentation textuelle de la méthode sous-jacente, il faut employer respectivement la méthode getName() ou toString().

Class classe = Class.forName("java.util.Hashtable");
Method methode = classe.getMethod("isEmpty", null);
String nomClasse = methode.getName();
String nomClasseDeclaration = 
                              methode.getDeclaringClass().getName();
String représentationMethode = methode.toString();

La classe Method dispose également de plusieurs méthodes destinées à récupérer les types de retour (getReturnType()), de paramètres formels (getParameterTypes()) et d'exceptions susceptibles d'être lancées (getExceptionTypes()), de la méthode sous-jacente représentée par l'objet Method.

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

public class Introspection {
  public static void main(String[] args) {
    try {
      Class classe = Class.forName("java.util.Vector");
      Method[] methodes = classe.getMethods();
      System.out.println("
Les méthodes publiques de la classe " + classe.getName() 
                                       + " et celles héritées des superclasses et interfaces.");
      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");
        Class[] tabTypesParams = methodes[i].getParameterTypes();
        for(int j = 0; j < tabTypesParams.length; j++){
          System.out.print(j > 0 ? ", " : "\t");
          System.out.print(tabTypesParams[j].getName());
        }
        System.out.print("\t");
        Class[] tabTypesExceptions = methodes[i].getExceptionTypes();
        for(int j = 0; j < tabTypesExceptions.length; j++){
          System.out.print(j > 0 ? ", " : "\t");
          System.out.print(tabTypesExceptions[j].getName());
        }
        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()!");
    }
  }
}