Ils sont très différents !
Comme indiqué dans la documentation de Class.forName(String)
,
Renvoie l'objet Classe associé à la classe ou à l'interface avec le nom de chaîne donné. L'appel de cette méthode est équivalent à : Class.forName(className, true, currentLoader)
( true
fait ici référence à voulez-vous initialiser la classe ? )
D'un autre côté, ClassLoader.loadClass(String)
:
L'appel de cette méthode est équivalent à l'appel de loadClass(name, false)
.
(ici, le booléen n'a rien à voir avec l'initialisation ; mais si vous consultez la documentation de loadClass(String, boolean), vous verrez que tout ce qu'il fait est de charger la classe, et non de l'initialiser).
Le premier ( Class.forName("SomeClass");
) le fera :
- utiliser le chargeur de classe qui a chargé la classe qui appelle ce code
- initialiser la classe (c'est-à-dire que tous les initialisateurs statiques seront exécutés)
L'autre ( ClassLoader.getSystemClassLoader().loadClass("SomeClass");
) le fera :
- utiliser le chargeur de classes "système" ( qui peut être remplacé par )
- ne pas initialiser la classe (par exemple, si vous l'utilisez pour charger un pilote JDBC, elle ne sera pas enregistrée, et vous ne pourrez pas utiliser JDBC !)
Supposons que vous codiez une application web qui sera exécutée sur un conteneur tel que Tomcat. Tomcat crée un chargeur de classes pour chaque application Web (afin de pouvoir décharger les applications Web ultérieurement et libérer de la mémoire - il faut un chargeur de classes dédié pour que cela fonctionne !) Dans cette situation, vous pouvez voir que les deux appels donneront des résultats très différents !
Pour des informations plus détaillées (et faisant autorité) sur le chargement et l'initialisation des classes, consultez les sections 12.2 y 12.4 de la dernière (3ème) édition de la spécification du langage Java.