Quelle est la différence entre new
operator et Class.forName(...).newInstance()
? Les deux créent des instances d'une classe, et je ne suis pas sûr de la différence entre elles.
L'opérateur new
crée un nouvel objet d'un type connu statiquement (au moment de la compilation) et peut appeler n'importe quel constructeur de l'objet que vous essayez de créer. C'est le moyen privilégié de créer un objet. C'est rapide et la JVM effectue de nombreuses optimisations agressives.
Class.forName().newInstance()
est une construction dynamique qui recherche une classe portant un nom spécifique. C'est plus lent que d'utiliser new
, car le type d'objet ne peut pas être codé en dur dans le bytecode, et parce que la machine virtuelle Java peut avoir à vérifier les autorisations pour vous assurer que vous disposez des droits pour créer un objet. Il est également partiellement dangereux car il utilise toujours un constructeur à zéro argument et si l'objet que vous essayez de créer ne possède pas de constructeur nullary, il lève une exception.
En bref, utilisez new
si vous savez au moment de la compilation quel est le type d'objet que vous voulez créer. Utilisez Class.forName().newInstance()
si vous ne savez pas quel type d'objet vous allez créer.
Class.forName("your class name").newInstance()
est utile si vous devez instancier des classes de manière dynamique, car vous n'avez pas à coder en dur le nom de la classe pour créer un objet.
Imaginez un scénario dans lequel vous chargez des classes de manière dynamique à partir d'une source distante. Vous connaîtrez leurs noms mais ne pourrez pas les importer lors de la compilation. Dans ce cas, vous ne pouvez pas utiliser new
pour créer de nouvelles instances. C'est (une des raisons) pourquoi Java propose la méthode newInstance()
.
Class.forName peut uniquement appeler le constructeur par défaut (sans paramètre) et le nom de la classe Peut être fourni pendant l'exécution, par exemple. le nom du pilote de base de données lu dans un fichier de configuration.
La principale différence est que Class.forName('your class name').newInstance()
est dynamique, car le type n'a pas besoin d'être codé en dur dans le code.
Class.forName("your class name").newInstance()
est utilisé lorsque vous souhaitez obtenir une instance d'un travail de classe similaire à new
, mais il est utile lorsque vous souhaitez obtenir une instance d'une classe d'un fichier jar ou d'un serveur distant et que vous ne pouvez pas l'importez en temps de compilation.
ex: Class.forName("YOUR JDBC DRIVER").newInstance()
, vous ne pouvez pas importer la classe JDBC au moment de la compilation.
Class.forName('myClass').newInstance()
charge la classe si ce n'est déjà fait. Ici, il appelle le constructeur initial et n'exécute que la partie statique du constructeur.
L'opérateur new
est utilisé pour initialiser de nouveaux objets.
Vous pouvez créer de nombreuses instances à partir de l'opérateur new
et de la différence Class.forName()
. C'est la deuxième fois que vous créez un bloc statique newInstance()
;
Un bon exemple de Class.forName('myClass).newInstance()
est le pilote JDBC.
Class.forName("com.mysql.JDBC.Driver").newInstance()
Class.forName
fera une recherche pour trouver l'objet Class
pour YourClass
.
L'utilisation du nouvel opérateur doit être identique à YourClass.class.newInstance()
.
Même si les deux font la même chose, vous devriez utiliser l'opérateur new au lieu de Class.forName ('class'). GetInstance (). Ce dernier utilise l'API de réflexion pour rechercher la classe au moment de l'exécution. En utilisant le nouvel opérateur, le VM saura d'avance que vous souhaitez utiliser cette classe et sera donc plus efficace.
Supposons que com.statckoverflow.Test
Class.forName
- Il va charger la classe Test et renvoyer l'objet Class
qui contient les métadonnées de la classe Test, telles que name, package, constructeur, annotations, méthodes et champs.
newInstance()
- Utilisé pour instancier de nouveaux objets à l'aide de Java Reflection. En interne, le constructeur de paramètres zéro sera appelé sur la classe Test
. Cela signifie que l'objet de la classe Class
créera l'objet de la classe Test
en appelant le constructeur de paramètre zéro. Nous pouvons utiliser la réflexion pour obtenir des détails sur la classe Test
. Comme constructeurs, méthodes etc.
Opérateur new
- Crée le nouvel objet pour la classe instancie la Class
et peut appeler ses constructeurs.