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

Ciao a tutti, sto creando in java un server web che supporti servlet e jsp. 
Iniziamo: ho evitato di postare il codice in cui compilo ogni volta, e 
ripeto ogni volta, la mia servlet correttamente. Questa è la parte del 
codice che mi da problemi:
// Carico la servlet
Class classServlet = Class.forName(classForName);
// Creo l'istanza di questa servlet
Object servletObject = classServlet.newInstance();
// Recupero il metodo "init"
Method methods = classServlet.getMethod("init");
// Invoco il metodo "init"
methods.invoke(servletObject);
Tutto funziona correttamente, ma quando modifico la mia servlet e la 
richiamo da browser (sempre con il server web in run), stranamente essa mi 
dà i risultati precedenti la modifica. Ad esempio, se la prima volta scrivo 
a video "Hello world!" e poi la modifico volendogli fare scrivere "Ciao a 
tutti!", essa mi visualizza ancora il vecchio "Hello world!". Ho pensato 
fosse un problema magari di garbage collector, ma non era questo il 
problema! Sapreste aiutarmi? Forse questa cosa può essere importante: questo 
codice, insieme con quello della compilazione della servlet, è contenuto in 
un thread eseguito ad ogni richiamo del browser! Grazie a tutti, spero di 
essere stato il più possibile chiaro!
Distinti saluti
Matteo 

 writes:
I> Ciao a tutti, sto creando in java un server web che supporti
I> servlet e jsp. 
Basta che poi al prof non presenti Tomcat come tesina :) :) :) :)
/* E chi lo dice, magari potresti entrare a far parte dei developer
   col tempo e impegnandoti */
Comunque complimenti per i risultati fin qui raggiunti.
I> Tutto funziona correttamente, ma quando modifico la mia servlet e
I> la richiamo da browser (sempre con il server web in run),
I> stranamente essa mi dà i risultati precedenti la modifica.
Non è  strano. Il  classloader di default  tiene la vecchia  classe in
memoria  e continua  ad usare  quella, sopratutto  se c'è  una istanza
della classe in uso.
Anche il buon tomcat ogni tanto deve essere riavviato :)
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione


Non penso però che tomcat, ogni volta che soltanto modifico di una virgola 
una servlet, debba essere riavviato tutte le volte. Non c'è un modo per 
togliere dalla memoria la classe caricata? Grazie ancora!
Distinti saluti
Matteo 

 writes:
I> Non penso perň che tomcat, ogni volta che soltanto modifico di una virgola 
I> una servlet, debba essere riavviato tutte le volte. 
Non tutte le volte ma capita. Capita sopratutto che vadano a ramengo altre
informazioni dell'applicazione e quindi si debba lo stesso riavviare.
E la stessa cosa mi č stata riferita per cose ben piů costicchiose :)
I> Non c'č un modo
I> per togliere dalla memoria la classe caricata?
Io comincerei a guardarli i sorgenti  di tomcat :), e dare un occhiata
al suo class loader (che occorre un classloader custom per farlo).
Se te la cavi con l'inglese:
http://blog.taragana.com/index.php/archive/how-to-unload-java-class/
http://java.sun.com/docs/books/jls/unloading-rationale.html
http://java.sun.com/developer/JDCTechTips/2003/tt0819.html
 
http://java.sun.com/developer/JDCTechTips/2003/tt0722.html



Grazie mille, come sempre!!!
Distinti saluti
Matteo