Quand vous utilisez Class.forName("SomeImpl")
vous obtenez la classe via le chargeur de classe actuel (c'est-à-dire le chargeur de la classe dans laquelle vous effectuez l'appel de méthode). Il sera également initialiser la classe. C'est effectivement la même chose que d'appeler Class.forName("SomeImpl", true, currentLoader)
où currentLoader
serait le chargeur de classe de l'appelant. Voir les détails aquí .
La deuxième méthode nécessite de choisir d'abord un classloader. Ne l'écrivez pas comme ClassLoader.loadClass("SomeImpl")
puisqu'il s'agit pas une méthode statique. Vous auriez besoin de quelque chose comme
final ClassLoader cl = this.getClass().getClassLoader();
Class theClass = cl.loadClass("SomeImpl");
N'oubliez pas que les sous-classes de ClassLoader doivent surcharger la fonction findClass plutôt que loadClass
. C'est la même chose que d'appeler la méthode (protégée) loadClass("SomeImpl", false)
où le second argument indique si la liaison doit être effectuée ou non.
Il existe des différences plus subtiles... Le site loadClass
s'attend à un nom de classe binaire tel que spécifié par la spécification du langage Java, alors que la méthode forName
pourrait également être utilisé avec des chaînes de caractères représentant des types primitifs ou des classes de tableaux.
Dans l'ensemble, il est préférable d'utiliser Class.forName
si nécessaire, en spécifiant un chargeur de classe spécifique et en indiquant s'il doit être initialisé ou non, puis en laissant l'implémentation s'occuper du reste. L'utilisation directe des chargeurs de classes permet de trouver des ressources dans un jar ou sur le classpath.
0 votes
Personnellement, j'essaie de ne pas utiliser de chaînes littérales dans mon code... Pensez à écrire
SomeImpl.class.getSimpleName()
au lieu de la valeur littérale codée en dur (ce qui évite les maux de tête lors du renommage de la classe).8 votes
@Yuval : D'ordinaire, je serais d'accord avec vous, mais dans le cas de
Class.forName()
le site point final c'est que tu lui passes une chaîne de caractères. Si vous avez unClass<SomeImpl>
qui traîne, alors vous n'avez pas besoin d'appelerClass.forName()
. Et si vous pouvez écrireSomeImpl.class
alors vous pouvez écrirenew SomeImpl()
au lieu d'utiliser la réflexion tout court.2 votes
@Yuval, le chargement dynamique des classes est une fonctionnalité essentielle de Java et n'a rien à voir avec l'utilisation d'une chaîne au lieu d'une classe. [D. Pryden en parle déjà].
0 votes
Le type de classe peut être passé en tant qu'argument au code (un
Class<?>
) à cette fin, mais vous avez généralement raison.0 votes
Duplication possible de Class.forName() vs ClassLoader.loadClass() - lequel utiliser pour le chargement dynamique ?