Quando creiamo un instace di una classe utilizzando nuovo operatore, fa due cose
- caricare la classe di memoria, se non viene caricato - che significa creare rappresentazione in memoria della classe dal file .class in modo che un'istanza possa essere creata al di fuori di esso. Ciò include l'inizializzazione delle variabili statiche (risoluzione di quella classe)
- creare un'istanza di tale classe e memorizzare il riferimento alla variabile.
Class.forName
fa solo la prima cosa. Carica la classe in memoria e restituisce tale riferimento come un'istanza di Class. Se vogliamo creare un'istanza, possiamo chiamare il metodo newInstance di quella classe. che invocherà il costruttore predefinito (nessun costruttore di argomenti). Si noti che se il costruttore predefinito non è accessibile, il metodo newInstance genererà un IllegalAccessException
. e se la classe è una classe astratta o un'interfaccia o non ha un costruttore predefinito, allora genererà uno InstantiationException
. Se si verifica un'eventuale eccezione durante la risoluzione di tale classe, verrà generato un valore ExceptionInInitializerError
.
Se il costruttore predefinito non è definito, è necessario richiamare il costruttore del defiend utilizzando l'API di reflection.
Ma il vantaggio principale con Class.forName è che può accettare il nome della classe come argomento String. Quindi possiamo passare il nome della classe in modo dinamico. Ma se creiamo un'istanza di una classe utilizzando un nuovo operatore, il nome della classe non può essere modificato dinamicamente.
Class.forName()
inturn chiamerà il metodo loadClass del chiamante ClassLoader (ClassLoder della classe da cui viene richiamato Class.forName
).
Per impostazione predefinita, lo Class.forName()
risolve quella classe. il che significa inizializzare tutte le variabili statiche all'interno di quella classe. stesso può essere modificato utilizzando il metodo sovraccarico di Class.forName(String name,boolean initialize,ClassLoader loader)
Il motivo principale per il caricamento del driver jdbc utilizzando Class.forName()
è, il driver può cambiare in modo dinamico. nel blocco statico tutti i driver creeranno un'istanza di se stessi e registreranno tale classe con DriverManager utilizzando il metodo DriverManager.registerDriver()
. Poiché lo standard Class.forName(String className)
risolve la classe, inizializzerà l'inizializzatore statico. Così, quando chiamiamo Class.forName("com.sun.jdbc.odbc.JdbcOdbcDriver")
, la classe driver viene caricato, istanziare e registra con DriverManager
Quindi, se si utilizza nuovo operatore che devi fare le seguenti cose.
Codice:
Driver drv = new com.sun.jdbc.odbc.JdbcOdbcDriver();
DriverManager.registerDriver(drv);
vedere anche http://stackoverflow.com/a/8053125/632951 – Pacerier