web-dev-qa-db-fra.com

Quelle est la différence entre l'opérateur new et Class.newInstance ()?

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.

28
i2ijeya

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.

47
templatetypedef

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().

11
Andreas_D

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. 

5
stacker

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.

3
fastcodejava

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.

3
Emad Aghayi

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()
2
Nipuna

Class.forName fera une recherche pour trouver l'objet Class pour YourClass.

L'utilisation du nouvel opérateur doit être identique à YourClass.class.newInstance().

1
Zeki

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. 

0
salexander

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.

0
Kanchan Kumar