Was ist der Unterschied zwischen new
Operator und Class.forName(...).newInstance()
? Beide erstellen Instanzen einer Klasse, und ich bin nicht sicher, was der Unterschied zwischen ihnen ist.Was ist der Unterschied zwischen dem neuen Operator und Class.newInstance()?
Antwort
Der Operator new
erstellt ein neues Objekt eines Typs, der statisch (zur Kompilierungszeit) bekannt ist, und kann einen beliebigen Konstruktor für das Objekt aufrufen, das Sie erstellen möchten. Es ist die bevorzugte Art ein Objekt zu erstellen - es ist schnell und die JVM führt viele aggressive Optimierungen durch.
Class.forName().newInstance()
ist ein dynamisches Konstrukt, das eine Klasse mit einem bestimmten Namen nachschlägt. Es ist langsamer als die Verwendung von new
, da der Objekttyp nicht in den Bytecode fest codiert werden kann und weil die JVM möglicherweise Berechtigungen überprüfen muss, um sicherzustellen, dass Sie die Berechtigung zum Erstellen eines Objekts besitzen. Es ist auch teilweise unsicher, da es immer einen Konstruktor mit null Argumenten verwendet. Wenn das Objekt, das Sie erstellen möchten, keinen Nullkonstruktor hat, löst es eine Ausnahme aus.
Kurz gesagt, verwenden Sie new
, wenn Sie zur Kompilierzeit wissen, was der Typ des Objekts ist, das Sie erstellen möchten. Verwenden Sie Class.forName().newInstance()
, wenn Sie nicht wissen, welche Art von Objekt Sie machen werden.
Class.forName
wird eine Suche nach dem Class
Objekt für YourClass
.
Der neue Operator sollte der gleiche sein wie YourClass.class.newInstance()
.
Class.forName kann nur den Standardkonstruktor (ohne Parameter) aufrufen, und Klassenname kann während der Laufzeit bereitgestellt werden, z. Der Name des DB-Treibers wird aus einer Konfigurationsdatei gelesen.
Dies ist nicht wahr, Sie können Konstruktoren abrufen, die Argumente benötigen und sie verwenden, um ein Objekt über die Reflektions-API zu instanziieren. Die Methode newInstance ruft jedoch explizit den Konstruktor no-arg auf und erfordert, dass er sichtbar und zugänglich ist. Die Antwort von templatetypedef ist die vollständigste/korrekteste und informativste. – LINEMAN78
Während beide effektiv dasselbe tun, sollten Sie den neuen Operator verwenden, statt Class.forName ('class') zu tun. GetInstance(). Letzterer verwendet die Reflection-API, um die Klasse zur Laufzeit zu suchen. Durch die Verwendung des neuen Operators weiß die VM im Voraus, dass Sie diese Klasse verwenden und somit effizienter sein möchten.
Class.forName('myClass').newInstance()
lädt die Klasse, wenn sie nicht bereits geladen ist. Hier ruft es den anfänglichen Konstruktor auf und führt nur den statischen Teil des Konstruktors aus.
Der Operator new
wird zum Initialisieren neuer Objekte verwendet.
Sie können viele Instanzen aus dem Operator new
erstellen und Class.forName()
Unterschied ist das 2. Mal erstellen Sie eine newInstance()
statische Blöcke werden nicht initialisiert.
Ein gutes Beispiel für Class.forName('myClass).newInstance()
ist der JDBC-Treiber
Class.forName("com.mysql.JDBC.Driver").newInstance()
Was passiert, wenn ich die Klasse
Nun, ich finde keine Methode getInstance(). Machst du? – Nipuna
korrigiert ....... – i2ijeya
Class.forName("your class name").newInstance()
nützlich, wenn Sie Klassen müssen dynamisch instanziiert, da Sie die Klasse zu hart Codenamen haben nicht ein Objekt zu erstellen.
Stellen Sie sich ein Szenario vor, in dem Sie Klassen dynamisch von einer entfernten Quelle laden. Sie werden ihre Namen kennen, können sie jedoch nicht zur Kompilierzeit importieren. In diesem Fall können Sie new
nicht verwenden, um neue Instanzen zu erstellen. Das ist (ein Grund) warum Java die newInstance()
Methode anbietet.
Großartig !! Es ist eine nützliche Antwort !! –
Wenn kein Zero-Argument-Konstruktor eines Objekts, es wird auch ein Objekt erstellen und es wird keine Ausnahme auslösen, finden Sie die folgenden Code-Schnipsel.hart zu werden braucht nicht codiert in den Code
try {
Class o = Class.forName("com.myCompany.MyClass");
Constructor m = o.getConstructor(Integer.class,String.class);
m.newInstance(new Integer(0),new String(""));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Der Hauptunterschied ist als Typ Class.forName('your class name').newInstance()
dynamisch ist.
Class.forName("your class name").newInstance()
verwendet, wenn Sie eine Instanz erhalten möchten ähnlich wie new
eine Klasse Arbeit bilden, aber es ist nützlich, wenn Sie zB von einer Klasse in einer JAR-Datei oder Remote-Server und Sie kann nicht importieren sie erhalten möchten in der Kompilierzeit.
Beispiel: Class.forName("YOUR JDBC DRIVER").newInstance()
, Sie können die JDBC-Klasse nicht zur Kompilierzeit importieren.
Das JDBC-Beispiel ist eigentlich nicht sehr gut, die Notwendigkeit, 'newInstance()' aufzurufen, existierte nur für einige frühe Versionen des MySQL JDBC-Treibers. –
des com.statckoverflow.Test
Class.forName
Nehmen wir - Es wird die Test-Klasse und gibt die Class
Klassenobjekt laden, wie Name, Paket, Konstruktor, Anmerkungen, Methoden, Felder der Metadaten von Test-Klasse enthält.
newInstance()
- Wird verwendet, um neue Objekte mit Java Reflection zu instanziieren. Interner Null-Parameter-Konstruktor wird für die Klasse Test
aufgerufen. Das bedeutet Class
Klassenobjekt erstellt das Klassenobjekt Test
durch Aufruf des Zero-Parameterkonstruktors. Wir können die Reflektion für Details der Klasse Test
verwenden. Wie Konstruktoren, Methoden usw.
new
operator - Erzeugt das neue Objekt für die Klasse instanziieren die Class
und kann ihre Konstruktoren aufrufen.
- 1. Was ist der Unterschied zwischen dem Operator "+" in ggplot2 und dem Operator "%>%" in magritr?
- 2. Was ist der Unterschied zwischen VB + + und Operator?
- 3. Was ist der Unterschied zwischen string :: at und string :: operator []?
- 4. Was ist der Unterschied zwischen Operator "=" und "==" in Bash?
- 5. was ist der Unterschied zwischen 'neuen()' int und 'int * p'
- 6. Was ist der Unterschied zwischen dem WebConfigurationManager und dem ConfigurationManager?
- 7. Was ist der Unterschied zwischen dem Standard- und dem Standardkonstruktor?
- 8. Was ist der Unterschied zwischen dem Betriebssystem und dem Kernel?
- 9. Was ist der Unterschied zwischen `-Contains` und` -In` in PowerShell?
- 10. Was ist der Unterschied zwischen `==` und `ist`?
- 11. Was ist der Unterschied zwischen mysqli :: real_connect und dem neuen mysqli-Objekt in der Verbindungsdatenbank?
- 12. Was ist der Unterschied zwischen expliziter atomarer Ladung/Speicherung und normalem Operator = und Operator T?
- 13. Unterschied zwischen dem Erstellen eines neuen Objekts und der Abhängigkeitsinjektion
- 14. Unterschied zwischen "neuer Operator" und "neuer Operator"?
- 15. Was ist der Unterschied zwischen einem Mixin und dem Dekorationsmuster?
- 16. Was ist der Unterschied zwischen OnStart und dem App Constructor
- 17. Was ist der Unterschied zwischen dem [OptionalField] und [NonSerialized]
- 18. Was ist der Unterschied zwischen `&` und `ref`?
- 19. Was ist der Unterschied zwischen dem neuen Habitat-Tool von Docker und Chef?
- 20. Was ist der Unterschied zwischen BlobBuilder und dem neuen Blob-Konstruktor?
- 21. Was ist der Unterschied zwischen:.! und: r !?
- 22. Was ist der Unterschied zwischen Difftime und '-'?
- 23. Was ist der Unterschied zwischen $ und $$?
- 24. Was ist der Unterschied zwischen Verilog! und ~?
- 25. was ist der Unterschied zwischen [[], []] und [[]] * 2
- 26. Was ist der Unterschied zwischen/* ... */und/** ... */
- 27. Was ist der Unterschied zwischen $ (...) und `...`
- 28. Was ist der Unterschied zwischen .Equals und ==
- 29. Was ist der Unterschied zwischen "$^N" und "$ +"?
- 30. Was ist der Unterschied zwischen + = und = +?
Es ist eine populäre Interviewfrage, & das ist eine große Antwort ... danke –
können Sie Konstruktoren erhalten, die Argumente erfordern und sie verwenden, um ein Objekt durch die Reflexion API zu instantiieren. –
Nur ein Hinweis, 'ClassNotFoundException' ist aktiviert, daher können Sie das nicht kompilieren:' try {optlib.SomeClass obj = new optlib.SomeClass(); } catch (ClassNotFoundException e) {} '. In diesem Fall müssen Sie 'Class.forName(). NewInstance()' verwenden. –