Newsgroup: it.comp.java
Titolo: Class.forName()

Mi sono dimenticato nel post precedente di porre
altre due domande:
1. a cosa serve la classe Class e perche'
nel collegamento ad un DB viene usata
l'espressione Class.forName(...)?
esempio:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
2. la classe DriverManager serve a gestire i driver
che vengono caricati in memoria, ma come?
Qualcuno potrebbe spiegarmi meglio perche' viene
utilizzata?
Grazie.

 utilizzata?
Quando il DriverManager riceve una chiamata a getConnection() cerca il 
driver appropriato per esaudire la richiesta in base alle "informazioni 
possedute", tra cui quella aggiunta durante il caricamente del Driver con 
Class.forName(). Attraverso il DriverManager il programmatore è sollevato 
dal dover dialogare direttamente col driver specifico e diventa più facile 
generare codice portabile (ovviamente stando attenti a *molte* altre cose 
dentro il software che si scrive).
Ciao :)
pole
-- 
Note: Some input words use a deprecated author.
Note: Read with -deprecation to understand.
http://web.tiscali.it/meridies

 generare codice portabile (ovviamente stando attenti a *molte* altre cose
[cut]
Cioe' chi programma non deve utilizzare alcun reference a cui passare la
stringa di connessione adatta.
Se non vi dispiace vorrei maggiori informazioni su questo argomento.
In rete non sono riuscito a trovare un sito in italiano che spieghi in modo
chiaro e semplice il ruolo delle classi di cui sopra.

 al metodo forName().
[cut]
Perche' in questo modo non viene creato un oggetto, che non verrebbe poi mai
utilizzato.
-- 
Lucio Benfante
Brainbench MVP for Java 1
http://www.brainbench.com
MyTranscript: 
http://www.brainbench.com/transcript.jsp?pid=167064

 
Esatto, e oltre a questo ribadisco che la stringa può variare a runtime 
(puoi leggerla per esempio da un file di configurazione - ecco il 
meccanismo dei plugin). Cioè posso fare:
Class.forName( nomePlugin );
dove nomePlugin è una stringa inizializzata da qualche altra parte.
Col new non lo puoi fare perché devi conoscere staticamente (a tempo di 
compilazione) il nome della classe ( infatti devi scrivere new NomeClasse() 
) che vuoi utilizzare, cosa che in un sistema dinamico a plugin 
generalmente non è ipotizzabile.
ciao :)


 utilizzata?
Allora, quando fai un forName come ti hanno già detto Lucio e Pole viene
lanciato l'inizializzatore statico della classe. I driver JDBC,
al'interno di tale chiamata, registrano se stessi con la classe
DriverManager.
Quando richiedi una connessione il DriverManager cominci a prendere il
primo driver JDBC che si è registrato e gli chiede: "Sei in grado di
gestire il protocollo jdbc:postgresql?" (ad esempio). Il driver MySQL
non lo è poichè conosce il protocollo jdbc:mysql e quindi rifiuta la
richiesta. Il secondo driver pure eccetera, finchè arrivi al driver JDBC
di PostgreSQL che, notando che l'URL contiene jdbc:postgresql risponde
"Hey, questo me lo smazzo io.". A quel punto il DriverManager ti riporta
una istanza di Connessione creata dal driver.
Tutto qui.
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------

 
Un "buon" driver JDBC si registra presso il DriverManager in un 
inizializzatore statico (un blocco "static" eseguito al caricamento della 
classe che implementa Driver). Appunto, per dire alla JVM di caricare una 
certa classe, il modo piu' comodo e' Class.forName().
Se vuoi puoi usare ClassLoader().getSystemClassLoader().loadClass(), ma e' 
piu' lungo. ;-)
-- 
Fighting for peace is like fucking for virginity
ObjectZone - 
http://space.tin.it/computer/csadun