Maison  >  Article  >  Java  >  Quelle est la différence entre `Class.forName()` et `Class.forName().newInstance()` dans la réflexion Java ?

Quelle est la différence entre `Class.forName()` et `Class.forName().newInstance()` dans la réflexion Java ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-08 11:56:01783parcourir

What is the difference between `Class.forName()` and `Class.forName().newInstance()` in Java reflection?

Class.forName() vs Class.forName().newInstance()

Lorsque vous travaillez avec la réflexion Java, deux méthodes entrent souvent en jeu jouer : Class.forName() et Class.forName().newInstance(). Pour comprendre leur distinction, utilisons un exemple :

Classe de démonstration :

package test;

public class Demo {

    public Demo() {
        System.out.println("Hi!");
    }

    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("test.Demo");
        Demo demo = (Demo) clazz.newInstance();
    }
}

Class.forName()

Selon sa documentation, Class.forName(String) récupère l'objet Class associé à la classe ou à l'interface portant le nom spécifié. Dans notre exemple, cela se traduit par test.Demo.class stocké dans la variable clazz.

Class.forName().newInstance()

clazz.newInstance() instancie la classe représentée par l'objet Class. Sans aucun argument, cela équivaut à un new Demo() et renvoie une nouvelle instance Demo.

Sortie :

L'exécution de cette classe Demo imprime :

Hi!

Instanciation dynamique

Essentiellement, newInstance permet l'instanciation dynamique des classes au moment de l'exécution, même si leurs noms ne sont pas connus au préalable. Cela favorise la flexibilité du code.

Applications pratiques

Les pilotes JDBC exploitent cette fonctionnalité pour charger le pilote approprié au moment de l'exécution en fonction de la base de données cible. De même, les conteneurs EJB et Servlet utilisent le chargement dynamique pour initialiser les composants sans connaissances préalables.

Initialisation du pilote JDBC

Les pilotes JDBC utilisent souvent des blocs d'initialisation statiques pour s'enregistrer auprès du DriverManager. lors de l'initialisation de la classe. Cela signifie que Class.forName(String) peut apparemment « créer » une instance d'un pilote JDBC, mais ce n'est qu'un sous-produit de l'implémentation du pilote.

Améliorations JDBC 4.0

Avec JDBC 4.0 et Java 7, le chargement automatique a été introduit, rendant l'utilisation explicite de Class.forName() inutile dans la plupart des cas. cas. Les développeurs peuvent se référer à la ressource « Améliorations JDBC 4.0 dans Java SE 6 » pour plus de détails.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn