VerboseClassLoader.java

import java.io.*;

public class VerboseClassLoader extends ClassLoader {
  public VerboseClassLoader() {
    // Précision du chargeur de classe parent
    super(getSystemClassLoader());
  }

  /** Méthode de chargement redéfinissant celle de ClassLoader. */
  public Class loadClass(String name)
    throws ClassNotFoundException {
    // Nous nous limitons au chargement de classes
    // dans le paquetage anonyme du répertoire courant
    System.out.println("Loading " + name + "...");
    try {
      // Récupération du bytecode dans le tableau b
      byte[] b = loadClassData(new File(name +".class"));
      // Construction de l'objet Class
      Class c = defineClass(name, b, 0, b.length);
      // Préparation de la classe construite
      resolveClass(c);
      return c;
    } catch (IOException e) {
      return getParent().loadClass(name);
    }
  }
  /** Place le contenu du fichier dans un tableau d'octets. */
  private byte[] loadClassData(File f) throws IOException {
    DataInputStream input =
      new DataInputStream(new FileInputStream(f));
    byte[] content = new byte[(int) f.length()];
    input.readFully(content);
    return content;
  }
  public static void main(String[] args) throws ClassNotFoundException,
    InstantiationException, IllegalAccessException {
    // Construction du chargeur de classes
    ClassLoader classLoader = new VerboseClassLoader();
    // Chargement de la classe A avec le chargeur
    Class clazz = classLoader.loadClass("A");
    // Création d'une instance de la classe chargée
    Object o = clazz.newInstance();
    if (o instanceof A) {
      System.out.println("Dans VerboseClassLoader : o instance de A");
    } else {
      System.out.println(
           "Dans VerboseClassLoader : o n'est pas instance de A");
    }
  }
}