PDA

View Full Version : [JAVA]Scaricare classi dalla JVM


nucarote
26-04-2007, 23:34
Vorrei poter caricare e scaricare classi racchiuse in file jar all'interno di una JVM.Fino ad ora ho utilizzato un'oggetto URLClassLoader ma purtroppo in fase di scaricamento, non riesco ad eliminare ogni riferimento agli oggetti creati da queste classi.Grazie già da ora per i vostri suggerimenti.

PGI-Bis
27-04-2007, 10:41
Allo scaricamento pensa la JVM e non c'è modo di darle suggerimenti in merito. Forse ci sono strade alternative. Cosa devi fare?

^TiGeRShArK^
27-04-2007, 10:56
Vorrei poter caricare e scaricare classi racchiuse in file jar all'interno di una JVM.Fino ad ora ho utilizzato un'oggetto URLClassLoader ma purtroppo in fase di scaricamento, non riesco ad eliminare ogni riferimento agli oggetti creati da queste classi.Grazie già da ora per i vostri suggerimenti.

che vuol dire che non riesci ad eliminare ogni riferimento? :mbe:
devi mantenere gli oggetti caricati in una cache? :fagiano:

nucarote
27-04-2007, 11:49
Allora ho un sistema a plugin, ogni plugin è composto da un file jar, quando carico il file jar all'interno di un URLClassLoader subito dopo carico anche una classe Handler contenuto nel suddetto jar,questa a sua volta si crea i suoi bei oggetti.Con una classe Handler che non crea oggetti il tutto funziona impostando l'oggetto URLClassLoader a null e chiamando subito dopo il garbage collection eppoi instanziare di nuovo per caricare i jar rimanenti, mentre con un Handler che crea oggetti questo non funziona.

PGI-Bis
27-04-2007, 12:26
Il comportamento del garbage collector è euristico. Se un programma funziona perchè System.gc() fa qualcosa è un bel problema :D.

Se vuoi caricare durante l'esecuzione una definizione di classe e renderla disponibile al resto del sistema, tutto ciò che occorre fare è creare e usare un nuovo ClassLoader quando carichi o ricarichi i plug-in. In questo modo le classi caricate risulteranno "nuove" pur avendo lo stesso nome pienamente qualificato.

Il resto è una questione di struttura del programma e immagino che tu già l'abbia fatta. Esisterà, ad esempio, un GestoreServiziPluggable al quale il sistema si rivolge quando deve essere eseguito un certo servizio sostituibile. Se il GestoreServiziPluggable non si limita ad eseguire compiti ma distribuisce questi servizi, tramite riferimenti di tipo interfaccia secondo le linee guida del caricamento dinamico di servizi sostituibili, allora esisterà anche un meccanismo che notifica agli utente del gestore di servizi l'avvenuta sostituzione di una definizione con un'altra.

nucarote
27-04-2007, 15:15
Il comportamento del garbage collector è euristico. Se un programma funziona perchè System.gc() fa qualcosa è un bel problema :D.

Se vuoi caricare durante l'esecuzione una definizione di classe e renderla disponibile al resto del sistema, tutto ciò che occorre fare è creare e usare un nuovo ClassLoader quando carichi o ricarichi i plug-in. In questo modo le classi caricate risulteranno "nuove" pur avendo lo stesso nome pienamente qualificato.

Il resto è una questione di struttura del programma e immagino che tu già l'abbia fatta. Esisterà, ad esempio, un GestoreServiziPluggable al quale il sistema si rivolge quando deve essere eseguito un certo servizio sostituibile. Se il GestoreServiziPluggable non si limita ad eseguire compiti ma distribuisce questi servizi, tramite riferimenti di tipo interfaccia secondo le linee guida del caricamento dinamico di servizi sostituibili, allora esisterà anche un meccanismo che notifica agli utente del gestore di servizi l'avvenuta sostituzione di una definizione con un'altra.

Si è quello che ho realizzato.Ma non riesco ad implementare l'undeployment del servizio ci ho provato con il sistema che ti ho spiegato ma non riesce a togliere tutti i riferimenti agli oggetti creati dalla classe Handler.

nucarote
27-04-2007, 15:15
Il comportamento del garbage collector è euristico. Se un programma funziona perchè System.gc() fa qualcosa è un bel problema :D.

Se vuoi caricare durante l'esecuzione una definizione di classe e renderla disponibile al resto del sistema, tutto ciò che occorre fare è creare e usare un nuovo ClassLoader quando carichi o ricarichi i plug-in. In questo modo le classi caricate risulteranno "nuove" pur avendo lo stesso nome pienamente qualificato.

Il resto è una questione di struttura del programma e immagino che tu già l'abbia fatta. Esisterà, ad esempio, un GestoreServiziPluggable al quale il sistema si rivolge quando deve essere eseguito un certo servizio sostituibile. Se il GestoreServiziPluggable non si limita ad eseguire compiti ma distribuisce questi servizi, tramite riferimenti di tipo interfaccia secondo le linee guida del caricamento dinamico di servizi sostituibili, allora esisterà anche un meccanismo che notifica agli utente del gestore di servizi l'avvenuta sostituzione di una definizione con un'altra.

Si è quello che ho realizzato.Ma non riesco ad implementare l'undeployment del servizio ci ho provato con il sistema che ti ho spiegato ma non riesce a togliere tutti i riferimenti agli oggetti creati dalla classe Handler.In sostanza vorrei realizzare una cosa tipo la gestione delle servlet da parte di Tomcat.

nucarote
27-04-2007, 16:58
Ho trovato il problema e ho risolto, vi ringrazio per le vostre risposte.
Sapete un modo per capire se ci sono dati nella Clipboard di sistema?

PGI-Bis
27-04-2007, 17:43
Prova con FlavorListener. E' un ascoltatore di eventi, lo attacchi alla Clipboard e dovresti ricevere una notifica attraverso il suo metodo flavorsChanged quando è disponibile un nuovo dato.

A dir la verità mi sembrava che ci fosse un altro modo ma è un po' che non metto più le mani sulla Clipoard, forse è quello.

nucarote
27-04-2007, 18:20
Prova con FlavorListener. E' un ascoltatore di eventi, lo attacchi alla Clipboard e dovresti ricevere una notifica attraverso il suo metodo flavorsChanged quando è disponibile un nuovo dato.

A dir la verità mi sembrava che ci fosse un altro modo ma è un po' che non metto più le mani sulla Clipoard, forse è quello.

Già ci ho provato ma mi fornisce solo eventi sui i dati che copio dalla mia applicazione mentre non sò nulla di quello che all'inizio della esecuzione del mio programma sò.

nucarote
27-04-2007, 19:05
Risolto anche questo con

Toolkit.getDefaultToolkit().getSystemClipboard()
.getContents(this).getTransferDataFlavors().length > 0