Comment fonctionne la Classe.forName() de travail?
Je viens d'apprendre sur java.sql package
. Il utilise Class.forName()
charger dynamiquement le pilote qui s'étend DriverManager
.
Puis, nous arrivons connexion à l'aide de DriverManager.getConnection()
méthode.
Alors, comment fonctionne la chose entière de travail?
Comment fonctionne la classe DriverManager savoir comment obtenir la connexion sans utiliser le nom de la classe de pilotes réels.
Aussi peut-on utiliser de la Classe.forName() pour les applications personnalisées... si ceci est expliqué par un exemple, je serai très heureux.
- Voir aussi stackoverflow.com/a/8053125/632951
Vous devez vous connecter pour publier un commentaire.
Class.forName
simplement les charges de la classe, y compris l'exécution de ses initialiseurs statiques, comme ceci:Tout le reste de la procédure, vous êtes en train de parler d'JDBC spécifiques. Le pilote qui implémente
Driver
, il ne s'étend pasDriverManager
- simplement enregistre une instance appropriée à l'aide deDriverManager.registerDriver
. Puis, quandDriverManager
besoin de trouver un pilote pour un particulier de la chaîne de connexion, il appelleconnect
sur chaque pilote inscrit à son tour jusqu'à ce que l'on y réussit, et renvoie une valeur non nulle de connexion.Noter que cette façon d'enregistrement des pilotes est raisonnablement à l'ancienne - regarder les docs pour
DriverManager
modernes, des moyens d'arriver à une source de données.com.mysql.jdbc.Driver
classe pourClass.forName("com.mysql.jdbc.Driver");
comme j'ai essayé deimport com.mysql.jdbc.Driver
fonctionne toujours pasmysql-connector-java-5.1.42-bin.jar
et lacom.mysql.jdc.Driver
classe est là.DriverManager
ne pas faire appelacceptsURL
, il se contente d'appelerconnect
, et le premier à réussir (pas de retourner la valeur null ou lever une exception) est la connexion qui est retourné.Lorsque nous créons une instace d'une classe à l'aide de l'opérateur new, il fait deux choses
ce qui signifie la création de la représentation en mémoire de la classe à partir de l' .fichier de classe de sorte qu'une instance peut être créé à partir d'elle. Cela comprend l'initialisation des variables statiques (la résolution de cette classe)
Class.forName
ne fait que la première chose.Il charge la classe de la mémoire et de retour que la référence comme une instance de la Classe. Si nous voulons créer une instance ensuite, nous pouvons appeler la méthode newInstance de cette classe. qui appelle le constructeur par défaut (sans argument du constructeur).
Notez que si le constructeur par défaut n'est pas accessible, alors newInstance méthode lève une
IllegalAccessException
. et si la classe est une classe abstraite ou une interface ou il n'a pas de constructeur par défaut, alors qu'il va jeter unInstantiationException
. Si aucune exception araises au cours de la résolution de cette classe, qu'il va jeter unExceptionInInitializerError
.Si le constructeur par défaut n'est pas défini, alors nous devons l'invoquer l'définie constructeur utilisant les API reflection.
Mais le principal avantage de la Classe.forName est, il peut accepter le nom de la classe comme un argument de type Chaîne. Nous pouvons donc passer le nom de la classe de façon dynamique. Mais si nous créons une instance d'une classe à l'aide de l'opérateur new, le nom de la classe ne peut pas être modifiée dynamiquement.
Class.forName()
inturn va appeler la méthode loadClass de l'appelant chargeur de classe (ClassLoder de la classe d'oùClass.forName
est invoquée).Par défaut, le
Class.forName()
résoudre cette classe. ce qui signifie, d'initialiser toutes les variables statiques à l'intérieur de cette classe.même peut être modifié à l'aide de la méthode surchargée de
Class.forName(String name,boolean initialize,ClassLoader loader)
La raison principale pour le chargement du pilote jdbc à l'aide de
Class.forName()
est, le conducteur peut changer de façon dynamique.dans la statique de bloquer tous les Pilotes de créer une instance de lui-même et de s'inscrire que de classe avec DriverManager à l'aide de
DriverManager.registerDriver()
méthode. Depuis leClass.forName(String className)
par défaut de résoudre la classe, il va initialiser l'initialiseur statique.Ainsi, lorsque nous appelons
Class.forName("com.sun.jdbc.odbc.JdbcOdbcDriver")
,la classe du Pilote sera chargé, instanciée et enregistre avec DriverManager
Donc, si vous utilisez l'Opérateur new, vous devez faire les choses suivantes.
Code:
Class.forName(..)
charge et initialise la classe cible. Cela signifie que l'initialiseur statique blocs sont invoquées (code défini dansstatic { .. }
.Si vous regardez, par exemple, MySQL pilote, en statique bloquer le conducteur est lui-même l'enregistrement:
DriverManager.registerDriver(new Driver());
Vous pouvez omettre le
Class.forName(..)
et inscrire le pilote vous-même si vous pouvez "se permettre" de la compilation de la dépendance du temps sur MySQL pilote.Cela dit, il sera rarement pertinent d'utiliser
Class.forName(..)
pour initialiser les classes à partir de votre application, car au moment de la compilation de la dépendance n'est pas un problème là.Également noter que
Class.forName(..)
n'est plus nécessaire pour JDBC depuis la version 4. À l'aide de la fournisseur de services mécanisme, vous pouvez charger le gestionnaire de pilotes que de la charge par un système de la propriété.La raison pour laquelle
Class.forName()
est fréquemment mentionné dans SQL exemples, c'est parce qu'il n'y a pas de magie à dire JDBC DriverManager comment à la carte de l'URL JDBC fourni à un vrai pilote.E. g. "mysql" doivent correspondre à une donnée MySQL classe, de la "fin" des cartes de l'Oracle de la classe, "as400" correspond à la DB2/400 classe.
Explicitement le chargement de la classe, ce qui a permis le code au sein de la classe lui-même l'enregistrement avec le DriverManager à exécuter.
Ces jours-ci la magie crochets sont présents permettant la JVM pour la découverte automatique des pilotes (si assez nouveau) si l'appel est superflu, mais de sortir de l'habitude encore nombreux à l'utiliser.