3.6. Utiliser le chargeur de classes par programmation dans un développement

3.6.1. Chargement des classes et des ressources par programmation dans le déploiement.

Vous pouvez trouver ou charger des classes ou des ressources par programmation dans votre code d'application. La méthode choisie dépendra d'un certain nombre de facteurs. Cette section décrit les méthodes disponibles et vous donne des instructions sur la façon de les utiliser.
Charger une classe en utilisant la méthode Class.forName()
Vous pouvez utiliser la méthode Class.forName() pour charger ou initialiser les classes par programmation. Cette méthode comprend deux signatures.
Class.forName(String className)
Cette signature ne prend en compte qu'un seul paramètre, le nom de la classe que vous devez charger. Avec cette méthode de signature, la classe est chargée par le chargeur de classes et initialise la classe nouvellement chargée par défaut.
Class.forName(String className, boolean initialize, ClassLoader loader)
Cette signature s'attend à recevoir trois paramètres : le nom de la classe, une valeur booléenne qui indique si on doit initialiser la classe, et le ClassLoader qui doit charger la classe.
La signature à trois arguments est la méthode recommandée pour charger une classe par programmation. Cette signature vous permet de contrôler si vous souhaitez que la classe cible soit initialisée pendant le chargement. Il est également plus efficace d'obtenir et de fournir le chargeur de classe parce que la JVM n'a pas besoin d'examiner la pile des appels pour déterminer quel chargeur de classe utiliser. En supposant que la classe contenant le code se nomme CurrentClass, vous pourrez obtenir le chargeur de classes de la classe par la méthode CurrentClass.class.getClassLoader().
L'exemple suivant donne un exemple de chargeur de classes qui puisse charger et initialiser la classe TargetClass :

Exemple 3.7. Fournir un chargeur de classes pour télécharger et initialiser les TargetClass.

Class<?> targetClass = Class.forName("com.myorg.util.TargetClass", true, CurrentClass.class.getClassLoader());
Chercher toutes les ressources avec un Prénom
Si vous connaissez le nom ou le chemin de la ressource, la meilleure façon de la charger directement serait d'utiliser la classe JDK ou l'API Classloader.
Charger une seule ressource
Pour charger une seule ressource qui se trouve dans le même répertoire que votre classe ou dans une autre classe de votre déploiement, vous pouvez utiliser la méthode Class.getResourceAsStream().

Exemple 3.8. Charger une seule ressource dans votre déploiement.

InputStream inputStream = CurrentClass.class.getResourceAsStream("targetResourceName");
Charger toutes les instances en une ressource unique
Pour charger toutes les instances d'une même ressource qui sont visibles par le chargeur de classe de votre déploiement, utilisez la méthode Class.getClassLoader retourne ().getResources(String resourceName), où resourceName est le chemin d'accès qualifié complet de la ressource. Cette méthode retourne une énumération de tous les objets URL pour les ressources accessibles par le chargeur de classe du prénom donné. Vous pouvez ensuite parcourir le tableau des URL pour ouvrir chaque flux à l'aide de la méthode openStream().

Exemple 3.9. Charger toutes les instances d'une ressource et itérer le résultat.

Enumeration<URL> urls = CurrentClass.class.getClassLoader().getResources("full/path/to/resource");
while (urls.hasMoreElements()) {
    URL url = urls.nextElement();
    InputStream inputStream = null;
    try {
        inputStream = url.openStream();
        // Process the inputStream
        ...
    } catch(IOException ioException) {
        // Handle the error
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (Exception e) {
                // ignore
            }
        }
    }
}

Note

Comme les instances URL sont chargées à partir du stockage local, il n'est pas utile d'utiliser openConnection() ou des méthodes semblables. Les flux sont plus faciles à utiliser et minimisent la complexité du code.
Charger un fichier de classe à partir d'un chargeur de classes
Si une classe a déjà été chargée, vous pouvez charger le fichier de classe qui correspond à cette classe en utilisant la syntaxe suivante :

Exemple 3.10. Charger un fichier de classe déjà chargée.

InputStream inputStream = CurrentClass.class.getResourceAsStream(TargetClass.class.getSimpleName() + ".class");
Si la classe n'a pas encore été chargée, vous devrez utiliser le chargeur de classes et en interpréter le chemin d'accès :

Exemple 3.11. Charger un fichier de classe d'une classe qui n'a pas été chargée.

String className = "com.myorg.util.TargetClass"
InputStream inputStream = CurrentClass.class.getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");