2010-01-19 11 views
14

Come scaricare una classe dal caricatore di classe, in modo da poter utilizzare la classe modificata di recente al volo senza riavviare la mia applicazione (distribuzione a caldo)? è possibile farlo?Come scaricare una classe già caricata in Java?

+3

Vedere anche http://stackoverflow.com/questions/148681/unloading-classes-in-java – Vadzim

risposta

4

Non è possibile scaricare una classe che è effettivamente in uso. Ma potresti voler dare un'occhiata a piattaforme come OSGi, se vuoi ricaricare o ridistribuire la tua applicazione durante il runtime.

6

Java rebel reloads ha cambiato classe al volo. Vedi the jrebel website for details. Non so che lo consiglierei comunque per un ambiente di produzione, a causa di problemi di prestazioni. JRebel occasionalmente blocca le cose momentaneamente quando hai ricompilato un server.

4

Non è possibile esplicitamente scaricare una classe.

In linea di principio, è possibile esplicitamente ricaricare una classe tramite Classloader.loadClass(). Da quel momento in poi, tutte le nuove istanze di quella classe useranno la nuova definizione.

In ogni caso, vorrei procedere con estrema cautela ...

2

Si dovrebbe creare un costume ClassLoader: che restituisce tutte le Object s avvolto all'interno di un proxy. Il numero ClassLoader deve avere un elenco di tutti i Proxy referenziati (mantenere questo elenco WeakReference d). Se decidi di "scaricare" e quindi "ricaricare" qualsiasi classe, attendi fino a quando la classe non viene caricata, trova tutti i proxy nel tuo elenco e sostituisci l'oggetto reale.

Ci sono diversi problemi: è necessario Reflection, per ottenere tutte le variabili private e ripristinare lo stato interno (vedere setAccesible su Field). Potrebbero verificarsi anche problemi di multi-threading, quindi il Proxy deve essere sincronizzato: il che lo rende scadente.

si può meglio cercare per soluzione dipendenza Guice di Google, che consente di scollegare e moduli di ricarica in fase di esecuzione. Questa potrebbe essere una soluzione, ma troppo gonfia per una piccola app. Ancora: non sono sicuro che il GC possa anche scaricare classi inutilizzate.

Problemi correlati