Il problema in termini generali è il modello di sicurezza di Java che tenta in realtà di impedire che una classe che ha già caricato caricare di nuovo.
Ovviamente Java ha supportato il caricamento di classi dinamiche, ma è difficile il re-caricamento della classe.
È stato considerato dannoso (e per una buona ragione) che un'applicazione java in esecuzione sia stata iniettata con una nuova classe con codice dannoso. Ad esempio, un'implementazione java.lang.String cracking proveniente da Internet, che invece di creare una stringa, cancella un file casuale hile invocando il metodo length().
Quindi, il modo in cui Java è stato concepito (e presumo .NET CLR di conseguenza, perché era altamente "ispirato" in JVM) era quello di impedire a una classe già caricata di caricare di nuovo quella stessa VM.
Hanno offerto un meccanismo per ignorare questa "funzione". Classloader, ma ancora una volta le regole per i programmi di caricamento classe, dovevano chiedere il permesso al classloader "genitore" prima di provare a caricare una nuova classe, se il genitore ha già caricato la classe, la nuova classe viene ignorata.
Per esempio ho usato classloader che caricano a classi da LDAP o RDBMS
Distribuisci caldo diventa una necessità nel mondo Java, quando il server di applicazione è diventato mainstream per Java EE (e anche creare la necessità di contenitori micro come la primavera per evitare questo tipo di fardello).
Riavviare l'intero server applicazione dopo ogni compilazione unità chiunque pazzo.
server provider Così app, offrono questo caricatori di classe "custom" per aiutare l'implementazione a caldo, e l'utilizzo di un file di configurazione, che il comportamento, dovrebbe essere disattivata quando è impostato in produzione. Ma il compromesso è che devi usare tonnellate di memoria in fase di sviluppo. Quindi il modo migliore per farlo è riavviare ogni 3 - 4 distribuzioni.
Questo non accade con altri linguaggi progettati fin dall'inizio per caricare le loro classi.
In Ruby, ad esempio, è anche possibile aggiungere metodi a una classe in esecuzione, sovrascrivere un metodo in fase di esecuzione o persino aggiungere un singolo metodo a un oggetto specifico univoco.
Il compromesso in questi tipi di ambienti è, naturalmente, memoria e velocità.
Spero che questo aiuti.
EDIT
ho trovato questo prodotto qualche tempo fa che promette che ricarica è rendere il più semplice possibile. Non ho ricordato il collegamento quando ho scritto per la prima volta questa risposta, e lo so.
È JavaRebel from ZeroTurnaround
Perché questo Wiki di comunità, tra l'altro? – Eddie
Pensavo che potesse essere d'aiuto nel caso in cui avessi lasciato qualcosa di poco chiaro ... fallo di default, è una cattiva etichetta? –
Divertente: ho trovato un think-o mentre rileggo proprio ora, grazie! –