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?
risposta
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.
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.
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 ...
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.
- 1. Controlla se una libreria di DLL è già stata caricata? (Java)
- 2. Quando si fa una classe scaricare dalla memoria heap
- 3. Cosa significa in realtà "Quando una classe è caricata"?
- 4. Quando esattamente una classe è stata caricata?
- 5. Ottieni bytecode dalla classe caricata
- 6. CPU caricata da Java
- 7. java.lang.UnsatisfiedLinkError: Native Library XXX.so già caricata in un altro classloader
- 8. come scaricare un file in java?
- 9. Come estendere una classe finale in Java
- 10. Come dichiarare una classe tipizzata in Java?
- 11. Come creare una classe dinamicamente in java
- 12. Come serializzare una classe generica in Java?
- 13. Come determinare se una classe estende un'altra classe in Java?
- 14. Esiste una classe circle in Java come la classe Rectangle
- 15. In che ordine sono le diverse parti di una classe inizializzate quando una classe viene caricata nella JVM?
- 16. Come jQuery slidingown una volta che la pagina è già stata caricata
- 17. Come verificare se una sessione di binari è già stata caricata?
- 18. Classe FIFO in Java
- 19. Come generare una classe java bean da un'interfaccia in IntelliJ?
- 20. Crea una classe Java come sequenza in Clojure
- 21. Come scaricare il file usando java spark?
- 22. In che punto del file system è stata caricata la mia classe Java?
- 23. RegisterClass fallito: classe esce già
- 24. Importare una classe personalizzata in Java
- 25. Creazione di una classe nodo in Java
- 26. Evitare l'istanziazione di una classe in java
- 27. In Clojure, come utilizzare una classe java in modo dinamico?
- 28. fare una classe immutabili in Java
- 29. Importa una classe in script java (javax.script)
- 30. In Java 8, esiste una classe ByteStream?
Vedere anche http://stackoverflow.com/questions/148681/unloading-classes-in-java – Vadzim