2011-01-06 25 views

risposta

34

L'operatore new crea un nuovo oggetto di un tipo noto in modo statico (in fase di compilazione) e può chiamare qualsiasi costruttore sull'oggetto che si sta tentando di creare. È il modo preferito di creare un oggetto: è veloce e la JVM esegue molte ottimizzazioni aggressive su di esso.

Class.forName().newInstance() è un costrutto dinamico che ricerca una classe con un nome specifico. È più lento dell'uso di new poiché il tipo di oggetto non può essere codificato nel bytecode e poiché la JVM potrebbe dover eseguire il controllo delle autorizzazioni per assicurarsi di disporre dell'autorizzazione per la creazione di un oggetto. È anche parzialmente non sicuro perché utilizza sempre un costruttore di argomenti zero e, se l'oggetto che stai tentando di creare non ha un costruttore null, genera un'eccezione.

In breve, utilizzare new se si conosce in fase di compilazione quale tipo di oggetto è che si desidera creare. Utilizzare Class.forName().newInstance() se non si conosce il tipo di oggetto che si sta creando.

+1

È una famosa domanda di intervista, e questa è un'ottima risposta ... grazie –

+0

è possibile ottenere costruttori che richiedono argomenti e li usano per creare un'istanza di un oggetto attraverso la riflessione api. –

+0

Solo una nota, 'ClassNotFoundException' è spuntata, quindi non puoi compilarlo:' prova {optlib.SomeClass obj = new optlib.SomeClass(); } catch (ClassNotFoundException e) {} '. In questo caso, devi usare 'Class.forName(). NewInstance()'. –

1

Class.forName eseguirà una ricerca per trovare l'oggetto Class per YourClass.

L'utilizzo del nuovo operatore deve essere uguale a YourClass.class.newInstance().

4

Class.forName può chiamare solo il costruttore predefinito (senza parametri) e il nome della classe può essere fornito durante il runtime, ad es. il nome del driver db legge da un file di configurazione.

+0

Questo non è vero è possibile ottenere costruttori che richiedono argomenti e li usano per creare un'istanza di un oggetto attraverso la riflessione api. Tuttavia, il metodo newInstance chiama specificamente il costruttore no-arg e richiede che sia visibile e accessibile. La risposta di templatetypedef è la più completa/corretta e informativa. – LINEMAN78

0

Mentre entrambi fanno effettivamente la stessa cosa, dovresti usare il nuovo operatore invece di fare Class.forName ('classe'). GetInstance(). Quest'ultimo utilizza l'API reflection per cercare la classe in fase di runtime. Usando il nuovo operatore, la VM saprà in anticipo che si desidera utilizzare quella classe e quindi essere più efficienti.

2

Class.forName('myClass').newInstance() carica la classe se non è già stata caricata. Qui chiama il costruttore iniziale e esegue solo la parte statica del costruttore.

L'operatore new viene utilizzato per inizializzare nuovi oggetti.

È possibile creare molte istanze sia dall'operatore new sia dalla differenza Class.forName() è la seconda volta che si creano blocchi statici newInstance() non inizializzati.

Un buon esempio di Class.forName('myClass).newInstance() è il driver JDBC

Class.forName("com.mysql.JDBC.Driver").newInstance() 
+0

Cosa succede se uso la classe inst1 = (Classe ) Class.forome ('myClass) .getInstance() ...... Classe inst2 = (Classe ) Class.forome (' myClass) .getInstance(). ............. Ciò renderà più istanze giuste. – i2ijeya

+1

Beh, non trovo un metodo getInstance(). Fai? – Nipuna

+0

corretto ....... – i2ijeya

4

Class.forName("your class name").newInstance() è utile se avete bisogno di istanziare le classi in modo dinamico, in quanto non si dispone di codificare il nome della classe per creare un oggetto.

Immaginate uno scenario in cui si caricano le classi dinamicamente da un'origine remota. Conoscerai i loro nomi ma non potrai importarli in fase di compilazione. In questo caso non è possibile utilizzare new per creare nuove istanze. Ecco (una ragione) perché Java offre il metodo newInstance().

+0

Fantastico !! È una risposta utile !! –

-1

Se nessun costruttore argomento zero di un oggetto creerà anche un oggetto e non genererà alcuna eccezione, si prega di trovare i frammenti di codice di seguito.

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

La differenza principale è Class.forName('your class name').newInstance() è dinamico come tipo non deve essere codificato duro nel codice.

3

Class.forName("your class name").newInstance() viene utilizzato quando si vuole ottenere un'istanza formare un lavoro di classe simile a new, ma è utile quando si desidera ottenere un'istanza da una classe in un file jar o server remoto e non si può importarlo in fase di compilazione.

ex: Class.forName("YOUR JDBC DRIVER").newInstance(), non è possibile importare la classe JDBC in fase di compilazione.

+1

L'esempio JDBC in realtà non è molto buono, la necessità di chiamare 'newInstance()' esisteva solo per alcune versioni iniziali del driver JDBC MySQL. –

0

Supponiamo com.statckoverflow.Test

Class.forName - Sarà caricare la classe di test e restituire l'oggetto Class classe che contiene i metadati di prova di classe come il nome, il pacchetto, costruttore, annotazioni, metodi, campi.

newInstance() - Utilizzato per creare un'istanza di nuovi oggetti utilizzando Java Reflection. Il costruttore di parametri internamente zero verrà chiamato sulla classe Test. Ciò significa che l'oggetto classe Class creerà l'oggetto classe Test chiamando il costruttore del parametro zero. Possiamo utilizzare la riflessione per i dettagli della classe Test. Come costruttori, metodi, ecc.

new operatore - Crea il nuovo oggetto per la classe istanziare il Class e può chiamare i loro costruttori.

Problemi correlati