2011-01-06 16 views

Antwort

34

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.

+1

Es ist eine populäre Interviewfrage, & das ist eine große Antwort ... danke –

+0

können Sie Konstruktoren erhalten, die Argumente erfordern und sie verwenden, um ein Objekt durch die Reflexion API zu instantiieren. –

+0

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. –

1

Class.forName wird eine Suche nach dem Class Objekt für YourClass.

Der neue Operator sollte der gleiche sein wie YourClass.class.newInstance().

4

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.

+0

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

0

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.

2

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() 
+0

Was passiert, wenn ich die Klasse inst1 = (Class ) Class.forName ('myClass) .getInstance() ...... Klasse inst2 = (Class ) Class.forName (' myClass) .getInstance(). ............. Dies wird mehrere Instanzen richtig machen. – i2ijeya

+1

Nun, ich finde keine Methode getInstance(). Machst du? – Nipuna

+0

korrigiert ....... – i2ijeya

4

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.

+0

Großartig !! Es ist eine nützliche Antwort !! –

-1

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(); 
} 
3

Der Hauptunterschied ist als Typ Class.forName('your class name').newInstance() dynamisch ist.

3

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.

+1

Das JDBC-Beispiel ist eigentlich nicht sehr gut, die Notwendigkeit, 'newInstance()' aufzurufen, existierte nur für einige frühe Versionen des MySQL JDBC-Treibers. –

0

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.

Verwandte Themen