Benvenuti su "Just a Bit of.. Entropy!".
Questo blog tratta di Free Software e programmazione.
L'autore è un di membro di Guru@Work
e studente del corso di laurea specialistica in
Tecnologie Informatiche all'università di Pisa.
[Java] Dynamic Loading

Programmando molto spesso si sente la necessità di poter inserire parti di codice aggiuntive in un sistema durante il suo uso (si pensi ad esempio alla possibilità di includere plugin, in una qualsivoglia applicazione, che debbano essere utilizzabili subito dopo la loro “installazione”) vediamo come, e con che limiti, questo è realizzabile con il linguaggio della Sun.
Compilazione a runtime:
Per prima cosa è utile sapere che da una qualsiasi applicazione java è possibile richiamare il compilatore (javac) con gli usuali parametri (classpath e quant’altro) con un semplice
Main.compile(new String[] { "-d","bin/", "src/generatedCode/"+filename+".java" }); |
NB: per i vari parametri (ne ho tralasciati molti, tra cui le varie opzioni di compilazione) vi lascio alla documentazione delle API.
Loading:
Avendo a disposizione il file .class da far caricare alla nostra applicazione abbiamo 2 strade percorribili, partendo dall’assunto che conosciamo il nome della classe:
- Se non abbiamo informazioni specifiche sulla classe ricavarle tramite i meccanismi di reflection e istanziarne i metodi;
- Se abbiamo strutturato i “plugin” per implementare una interfaccia nota istanziare un oggetto (come vedremo a breve) e chiamare i metodi dell’interfaccia.
Prenderò in considerazione il 2 caso perché altrimenti divagherei troppo su un argomento abbastanza complicato ed interessante quale è la Reflection.
Prendiamo in considerazione il seguente caso:
La classe A (quella che vogliamo caricare) implementa l’interfaccia B.
ClassLoader loader = new ClassLoader(); Class<?> cls = loader.loadClass("A"); B istanza_di_A = (B) cls.newInstance(); istanza_di_A.metodoDiA(...); |
Come si può notare il procedimento è molto semplice da realizzare, vediamo adesso quale è il limite principale.
Unloading\Reloading:
Purtroppo la JVM non consente l’unloading del bytecode relativo alle classi caricate.
Prendiamo in considerazione l’idea di modificare il codice della classe A una volta dopo aver istanziato un oggetto di tale tipo nel nostro programma. Vorremmo, come sembrerebbe naturale, che, una volta caricato il bytecode della classe modificata e ricompilata, i nuovi oggetti di tipo “A” vengano creati attenendosi all’ultima versione disponibile.
Purtroppo ciò non si verifica, vediamo il perché.
Il classloader, che precedentemente abbiamo utilizzato per “caricare” in memoria il bytecode della nostra classe a runtime, come abbiamo detto non da la possibilità (ne manuale ne automatica) di gestire l’unloading delle classi istanziate dall’applicazione. Al momento della creazione di un oggetto si limita a seguire il seguente algoritmo (che riporto in modo molto semplificato):
- Controlla in una sua struttura dati (un hashtable) se esiste un entry per la classe che gli è stato chiesto di caricare accedendo con il nome della classe (”nome_classe”->”bytecode”);
- Se non trova entry in corrispondenza di tale nome ne crea una e, dopo aver letto il file .class, salva il bytecode in tale struttura ritornando quindi al programma un istanza dell’oggetto.
- Alternativamente, se trova un entry per il nome della classe, non si preoccupa di valutare in un qualsivoglia modo se il bytecode è aggiornato o meno; istanzia un oggetto dal bytecode precedentemente salvato e lo ritorna al programma.
Come è facile immaginare le modifiche saranno quindi effettive solo al successivo riavvio del programma.
L’unica soluzione esistente è quella di implementare un ClassLoader personalizzato la cui istanza si occupi di caricare\istanziare le classi che vogliamo usare come plugin e che, una volta che queste subiscano modifiche, possiamo “buttare via” (ponendo a null tutti i relativi riferimenti) per reinstanziarene una nuova istanza che si prenda carico di gestire il nuovo codice nella sua struttura dati privata.
Macchinosa vero come soluzione? Bhe se lo fa anche Tomcat per aggiornare le odifiche delle jsp direi che è opportuno adeguarsi
Blog realizzato da Giulio Rossetti.
Immagine presente nell'header realizzata da bunocb e disponibile sul sito crystalxp
![Aggiungi '[Java] Dynamic Loading' a Del.icio.us Aggiungi '[Java] Dynamic Loading' a Del.icio.us](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/delicious.png)
![Aggiungi '[Java] Dynamic Loading' a digg Aggiungi '[Java] Dynamic Loading' a digg](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/digg.png)
![Aggiungi '[Java] Dynamic Loading' a FURL Aggiungi '[Java] Dynamic Loading' a FURL](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/furl.png)
![Aggiungi '[Java] Dynamic Loading' a blinklist Aggiungi '[Java] Dynamic Loading' a blinklist](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/blinklist.png)
![Aggiungi '[Java] Dynamic Loading' a reddit Aggiungi '[Java] Dynamic Loading' a reddit](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/reddit.png)
![Aggiungi '[Java] Dynamic Loading' a Feed Me Links Aggiungi '[Java] Dynamic Loading' a Feed Me Links](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/feedmelinks.png)
![Aggiungi '[Java] Dynamic Loading' a Technorati Aggiungi '[Java] Dynamic Loading' a Technorati](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/technorati.png)
![Aggiungi '[Java] Dynamic Loading' a Yahoo My Web Aggiungi '[Java] Dynamic Loading' a Yahoo My Web](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/yahoo_myweb.png)
![Aggiungi '[Java] Dynamic Loading' a Newsvine Aggiungi '[Java] Dynamic Loading' a Newsvine](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/newsvine.png)
![Aggiungi '[Java] Dynamic Loading' a Socializer Aggiungi '[Java] Dynamic Loading' a Socializer](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/socializer.png)
![Aggiungi '[Java] Dynamic Loading' a Ma.gnolia Aggiungi '[Java] Dynamic Loading' a Ma.gnolia](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/magnolia.png)
![Aggiungi '[Java] Dynamic Loading' a Stumble Upon Aggiungi '[Java] Dynamic Loading' a Stumble Upon](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png)
![Aggiungi '[Java] Dynamic Loading' a Google Bookmarks Aggiungi '[Java] Dynamic Loading' a Google Bookmarks](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/google.png)
![Aggiungi '[Java] Dynamic Loading' a RawSugar Aggiungi '[Java] Dynamic Loading' a RawSugar](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/rawsugar.png)
![Aggiungi '[Java] Dynamic Loading' a Squidoo Aggiungi '[Java] Dynamic Loading' a Squidoo](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/squidoo.png)
![Aggiungi '[Java] Dynamic Loading' a BlinkBits Aggiungi '[Java] Dynamic Loading' a BlinkBits](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/blinkbits.png)
![Aggiungi '[Java] Dynamic Loading' a Netvouz Aggiungi '[Java] Dynamic Loading' a Netvouz](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/netvouz.png)
![Aggiungi '[Java] Dynamic Loading' a Rojo Aggiungi '[Java] Dynamic Loading' a Rojo](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/rojo.png)
![Aggiungi '[Java] Dynamic Loading' a Blogmarks Aggiungi '[Java] Dynamic Loading' a Blogmarks](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/bmarks.png)
![Aggiungi '[Java] Dynamic Loading' a Co.mments Aggiungi '[Java] Dynamic Loading' a Co.mments](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/comments.png)
![Aggiungi '[Java] Dynamic Loading' a Scuttle Aggiungi '[Java] Dynamic Loading' a Scuttle](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/scuttle.png)
![Aggiungi '[Java] Dynamic Loading' a Bloglines Aggiungi '[Java] Dynamic Loading' a Bloglines](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/bloglines.png)
![Aggiungi '[Java] Dynamic Loading' a Tailrank Aggiungi '[Java] Dynamic Loading' a Tailrank](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/tailrank.png)
![Aggiungi '[Java] Dynamic Loading' a Segnalo Aggiungi '[Java] Dynamic Loading' a Segnalo](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/segnalo.png)
![Aggiungi '[Java] Dynamic Loading' a OKnotizie Aggiungi '[Java] Dynamic Loading' a OKnotizie](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/oknotizie.gif)
![Aggiungi '[Java] Dynamic Loading' a Netscape Aggiungi '[Java] Dynamic Loading' a Netscape](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/netscape.gif)
![Aggiungi '[Java] Dynamic Loading' a Bookmark.it Aggiungi '[Java] Dynamic Loading' a Bookmark.it](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/bookmark.png)
![Aggiungi '[Java] Dynamic Loading' a Ask Aggiungi '[Java] Dynamic Loading' a Ask](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/ask.png)
![Aggiungi '[Java] Dynamic Loading' a Linkagogo Aggiungi '[Java] Dynamic Loading' a Linkagogo](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/linkagogo.png)
![Aggiungi '[Java] Dynamic Loading' a Delirious Aggiungi '[Java] Dynamic Loading' a Delirious](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/delirious.png)
![Aggiungi '[Java] Dynamic Loading' a Socialdust Aggiungi '[Java] Dynamic Loading' a Socialdust](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/socialdust.png)
![Aggiungi '[Java] Dynamic Loading' a Live-MSN Aggiungi '[Java] Dynamic Loading' a Live-MSN](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/live.png)
![Aggiungi '[Java] Dynamic Loading' a SlashDot Aggiungi '[Java] Dynamic Loading' a SlashDot](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/slashdot.png)
![Aggiungi '[Java] Dynamic Loading' a Sphinn Aggiungi '[Java] Dynamic Loading' a Sphinn](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/sphinn.png)
![Aggiungi '[Java] Dynamic Loading' a Diggita Aggiungi '[Java] Dynamic Loading' a Diggita](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/diggita.png)
![Aggiungi '[Java] Dynamic Loading' a Seotribu Aggiungi '[Java] Dynamic Loading' a Seotribu](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/seotribu.png)
![Aggiungi '[Java] Dynamic Loading' a FaceBook Aggiungi '[Java] Dynamic Loading' a FaceBook](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/facebook.png)
![Aggiungi '[Java] Dynamic Loading' a Upnews Aggiungi '[Java] Dynamic Loading' a Upnews](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/upnews.png)