Lorsque nous créons un instace d'une classe en utilisant l'opérateur new, il fait deux choses
- Charger la classe dans la mémoire, si elle n'est pas chargée. ce qui signifie créer une représentation en mémoire de la classe à partir du fichier .class afin qu'une instance puisse être créée à partir de celle-ci. Cela inclut l'initialisation des variables statiques (résolution de cette classe).
- créer une instance de cette classe et stocker la référence à la variable.
Class.forName
ne fait que la première chose. Il charge la classe en mémoire et renvoie cette référence comme une instance de Class. Si nous voulons créer une instance, nous pouvons appeler la méthode newInstance de cette classe, qui invoquera le constructeur par défaut (constructeur sans argument). Notez que si le constructeur par défaut n'est pas accessible, alors la méthode newInstance lèvera une erreur de type IllegalAccessException
. et si la classe est une classe abstraite ou une interface ou si elle n'a pas de constructeur par défaut, alors elle lancera un InstantiationException
. Si une exception survient au cours de la résolution de cette classe, elle lancera un ExceptionInInitializerError
.
Si le constructeur par défaut n'est pas défini, nous devons alors invoquer le constructeur défini en utilisant l'API de réflexion.
Mais le principal avantage de Class.forName est qu'il peut accepter le nom de la classe comme argument de type String. Nous pouvons donc passer le nom de la classe de façon dynamique. Mais si nous créons une instance d'une classe en utilisant l'opérateur new, le nom de la classe ne peut pas être modifié dynamiquement.
Class.forName()
appellera à son tour la méthode loadClass de l'appelant ClassLoader (ClassLoder de la classe d'où provient l'élément Class.forName
est invoquée).
Par défaut, le Class.forName()
résoudre cette classe. ce qui signifie, initialiser toutes les variables statiques à l'intérieur de cette classe. La même chose peut être modifiée en utilisant la méthode surchargée de Class.forName(String name,boolean initialize,ClassLoader loader)
La raison principale pour charger le driver jdbc en utilisant Class.forName()
c'est que le conducteur peut changer dynamiquement. Dans le bloc statique, tous les pilotes créeront une instance d'eux-mêmes et enregistreront cette classe auprès du DriverManager en utilisant les éléments suivants DriverManager.registerDriver()
méthode. Puisque la Class.forName(String className)
par défaut résoudre la classe, elle va initialiser l'initialisateur statique. Ainsi, lorsque nous appelons Class.forName("com.sun.jdbc.odbc.JdbcOdbcDriver")
, la classe Driver sera chargée, instanciée et enregistrée avec DriverManager.
Donc si vous utilisez le nouvel opérateur, vous devez faire les choses suivantes.
Code :
Driver drv = new com.sun.jdbc.odbc.JdbcOdbcDriver();
DriverManager.registerDriver(drv);
0 votes
Voir aussi stackoverflow.com/a/8053125/632951