2010-07-15 6 views

risposta

1

Il suo scopo è di caricare dinamicamente la definizione della classe specificata dal nome completo passato come argomento stringa .

Ciò significa che la JVM cercherà efficacemente il file .class all'interno degli oggetti classpath e quindi con newInstance() si richiede una nuova istanza di tale classe.

Se la classe era già stata caricata prima, è già nella cache e non verrà più recuperata dal file. (non sicuro al 100%, forse sei autorizzato a "aggiornare" una definizione di classe al runtime ma personalmente penso che creerebbe incoerenze)

3

Carica il driver JDBC MySQL.

Il motivo per cui si esegue questa operazione non è direttamente utilizzare questa classe in modo che non vi sia alcun collegamento statico al nome della classe. Quando si tenta di aprire una connessione al database, si utilizza semplicemente un java.sql.Connection e non una classe o un'interfaccia specifica per MySQL. Quella traduzione è fatta dietro le quinte con il caricamento dinamico della classe.

Si sta caricando quella classe in modo che possa registrarsi con il sottosistema JDBC per quando si effettua la connessione successivamente.

8

Usa la riflessione per cercare il classpath per una classe chiamata "com.mysql.jdbc.Driver" e ne crea una nuova istanza.

Nel codice quando si scrive

Integer foo = new Integer() 

Si potrebbe invece scrivere

Integer foo = Class.forName("java.lang.Integer").newInstance() 

Ma perché andare a tutti questi guai? Perché vuoi caricare il tuo driver di database in fase di runtime, non inserire codice rigido. Quindi, se cambi database, cambi semplicemente un file di configurazione che caricherà un driver di database diverso. Nel tuo caso specifico potrebbe non essere importante, ma apre nuove possibilità sulla configurazione del database (e questo Class.forome è come di solito viene fatto)

+0

Bene, è comunque codificato. Come una stringa, ma è necessario compilare nuovamente per cambiare il driver. In Java 6 e JDBC 4, non è più richiesto come può essere visto qui: http://onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se- 6.html. – kolrie

1

Una chiamata a Class.forName ("X") fa caricare dinamicamente la classe chiamata X (in fase di esecuzione).

1

Quando si esegue il programma java, è necessario classpath e percorso predefinito per raccogliere alcuni jar (contengono classi) e classi. La JVM caricherà tutti quei vasi (contengono classi) e le classi per preparare l'avvio del tuo programma java.

Class.forName ("className") esamina tutte queste classi caricate per restituire il particolare "className" per creare da esso un'istanza/oggetto.

Si tratta di una dinamica modo di fare lo stesso che nel momento della compilazione istanze di oggetti:

ClassName classInstance = new ClassName(); 
+0

In modo dinamico, significa che la stringa "className" può essere generata/fornita in base all'interazione dell'utente con il programma (console o interfaccia grafica o altro modo dinamico). Anche se nell'esempio in questa domanda, "com.mysql.jdbc.Driver" è una stringa hardcoded. – ttchong

7

Quasi certamente, com.mysql.jdbc.Driver ha un inizializzatore statico che assomiglia a questo:

static {java.sql.DriverManager.registerDriver(new com.mysql.jdbc.Driver())}; 

Questa inizializzatore statico viene chiamato quando si utilizza il metodo forName. Quindi senza rendersene conto hai registrato il driver MySQL.

Per quanto riguarda lo newInstance, non so perché è lì. Sembra inutile.

+0

BTW, l'uso di "Class.forName" non è più necessario. Il driver può essere trovato dal gestore dei driver senza: http://download-llnw.oracle.com/javase/6/docs/api/java/sql/DriverManager.html – OscarRyz

+0

Nella documentazione MySQL- http: // dev .mysql.com/doc/refman/5.5/it/connector-j-usagenotes-connect-drivermanager.html esiste un riferimento a .newInstance() come soluzione alternativa per le implementazioni Java non funzionanti –

-1

Class.forName(String name)

restituisce l'oggetto classe associato alla classe [...] il nome dato stringa

Ciò significa, che, sarebbe tornare (o tentare) per tornare la classe com.mysql.jdbc.Driver

tardi Class.newInstace()

Crea una nuova istanza della classe rappresentata da questo [...] oggetto

Allora, che cosa fa quella linea, è quello di creare dinamicamente un'istanza mysql Driver.

questo:

Class.forName ("com.mysql.jdbc.Driver").newInstance(); 

sarebbe equivalente a:

import java.sql.Driver; 
.... 
Driver driver = new com.mysql.jdbc.Driver() 

Tra l'altro in base alle DriverManager doc, non c'è bisogno di usarlo più:

Le applicazioni non devono più caricare esplicitamente i driver JDBC utilizzando Class.forName()

Serve per caricare il driver, ma ora DriverManager utilizza un'altra strategia.

Infine, leggere il:

NOTA: L'interfaccia DataSource, nuovo nella 2.0 API JDBC, fornisce un altro modo per connettersi a una fonte di dati. L'uso di un oggetto DataSource è il mezzo preferito per connettersi a un'origine dati.

1

Class.forName viene utilizzato per caricare l'oggetto Class per il nome di classe completo specificato. Quando l'oggetto, qui si riferisce a com.mysql.jdbc.Driver, viene caricato, verrà richiamata l'espressione statica.Quindi, sebbene Class.newInstance() non sia invocato per creare una nuova istanza, è necessario che ci sia un inizializzazione statica in com.mysql.jdbc.Driver.