[Java] Dynamic Loading

Programa muitas vezes sentem a necessidade de inserir elementos de código em um sistema durante seu uso (considerar, por exemplo, a possibilidade de incluir o plugue em qualquer uma aplicação, devem ser utilizados imediatamente após a sua instalação "), vemos como e com que limites, isso é possível com a linguagem do Sol
Compilando em tempo de execução:
Primeiro, é útil saber que a partir de qualquer aplicação Java pode chamar o compilador (javac) com os parâmetros habituais (classpath e tudo mais) com um simples
new String [ ] { Principal. Compile (String [] ( , "d", "bin /", filename + ".java" } ) ; "generatedCode / src /" + filename +. "java")); |
NB: para os diferentes parâmetros (deixei de fora muitos, incluindo as opções de compilação) Deixo a documentação da API.
Carregando:
Porque você tem o arquivo. De classe para carregar a nossa aplicação, temos 2 estradas, partindo do pressuposto de que sabemos o nome da classe:
- Se não temos informações específicas sobre a deduzir da classe através dos mecanismos de reflexão e de métodos de instanciação;
- Se temos estruturado o plug-in "para implementar uma interface conhecida para instanciar um objeto (como veremos em breve) e chamar os métodos da interface.
2 Eu vou considerar o caso porque senão divagar muito sobre um tema que é bastante complicada e interessante reflexão.
Considere o seguinte caso:
Classe A (o que queremos para carregar) B implementa a interface.
new ClassLoader ( ) ; ClassLoader loader = new ClassLoader (); gt ; cls = loader. loadClass ( "A" ) ; Classe & lt;? & Gt; cls = carregador. LoadClass ( "A"); B ) cls. newInstance ( ) ; Istanza_di_A B = (B) CLS. NewInstance (); ... ) ; istanza_di_A. metodoDiA (...); |
Como você pode ver o processo é muito simples de implementar, vamos ver agora qual é a principal limitação.
UnloadingReloading:
Infelizmente, a JVM não permite a descarga de classes carregadas em bytecode.
Considere a idéia de que altera o Código da classe de uma vez depois de instanciar um objeto desse tipo em nosso programa. Gostaríamos, como parece natural que bytecode, uma vez carregado da classe alterado e recompilado, os novos objetos do tipo "A" são criados de acordo com a versão mais recente disponível.
Infelizmente, isso não ocorre, vemos o porquê.
O carregador de classe, que já estamos habituados a "carregar" na memória da nossa classe bytecode em tempo de execução, como já dissemos, não pode ser (manual ou automática) para lidar com a descarga de classes instanciadas pela aplicação. Na época da criação de um objeto é apenas seguir o seguinte algoritmo (que transportam um muito simplificado):
- Verifique em uma estrutura de dados (uma tabela hash), se existir uma entrada para a classe que ele foi convidado para carregar indo com o nome da classe (class_name "-> bytecode");
- Se você não consegue encontrar as entradas correspondentes no nome cria um e, após a leitura do arquivo. Classe, salve o bytecode de uma estrutura deste tipo, em seguida, retorna uma instância do programa.
- Alternativamente, se você encontrar uma entrada para o nome da classe, não se preocupa de alguma forma a avaliar se o bytecode é atualizado ou não; instancia um objeto a partir de bytecodes salvou e voltou para o programa.
Como você pode imaginar, em seguida, as mudanças só terão efeito quando você reiniciar o programa.
A única solução existente é implementar um ClassLoader personalizado caso lidamos com aulas caricareistanziare que pretende utilizar como um plug-in e que, quando ocorrer alguma mudança, nós podemos "deitar fora" (colocando todas as suas referências ao null) reinstanziarene para um novo aplicativo que cuida da gestão do novo código em sua estrutura de dados privados.
Solução real Cumbersome? Bem, se ele faz bem para atualizar o LTERAÇÕES Tomcat JSPs diria que é necessário para ajustar ![]()
Popularity: 19% [?]
Palavras-chave: bytecode, ClassLoader, Compile, Dynamic Loading, hotswap, Java, JSP, JVM, de carga, recarga, Runtime, Tomcat, Unloading
leave a response , or trackback from your own site. Você pode acompanhar quaisquer respostas a esta entrada através do RSS 2.0 feed. Você pode deixar uma resposta, ou trackback de seu próprio site.



![Add '[Java] Carga Dinâmica' ao Del.icio.us Aggiungi '[Java] Dynamic Loading' a Del.icio.us](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/delicious.png)
![Add '[Java] Dynamic Carregando' to digg Aggiungi '[Java] Dynamic Loading' a digg](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/digg.png)
![Add '[Java] Dynamic Loading "a FURL Aggiungi '[Java] Dynamic Loading' a FURL](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/furl.png)
![Add '[Java] Dynamic Loading "ao blinklist Aggiungi '[Java] Dynamic Loading' a blinklist](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/blinklist.png)
![Add '[Java] Dynamic Loading "ao reddit Aggiungi '[Java] Dynamic Loading' a reddit](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/reddit.png)
![Add '[Java] Carga Dinâmica' ao Feed Me Links Aggiungi '[Java] Dynamic Loading' a Feed Me Links](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/feedmelinks.png)
![Add '[Java] Dynamic Loading "a Technorati Aggiungi '[Java] Dynamic Loading' a Technorati](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/technorati.png)
![Add '[Java] Web Carga Dinâmica' ao Yahoo My Aggiungi '[Java] Dynamic Loading' a Yahoo My Web](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/yahoo_myweb.png)
![Add '[Java] Dynamic Loading "a Socializer Aggiungi '[Java] Dynamic Loading' a Socializer](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/socializer.png)
![Add '[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)
![Add '[Java] Dynamic Carregando' to Google Bookmarks Aggiungi '[Java] Dynamic Loading' a Google Bookmarks](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/google.png)
![Add '[Java] Dynamic Loading "a Bloglines Aggiungi '[Java] Dynamic Loading' a Bloglines](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/bloglines.png)
![Add '[Java] Dynamic Loading "a Squidoo Aggiungi '[Java] Dynamic Loading' a OKnotizie](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/oknotizie.gif)
![Add '[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)
![Add '[Java] Dynamic Carregando' to Ask Aggiungi '[Java] Dynamic Loading' a Ask](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/ask.png)
![Add '[Java] Dynamic Loading' a Delirious Aggiungi '[Java] Dynamic Loading' a Delirious](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/delirious.png)
![Add '[Java] Dynamic Carregando' to Live-MSN Aggiungi '[Java] Dynamic Loading' a Live-MSN](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/live.png)
![Add '[Java] Dynamic Loading' a SlashDot Aggiungi '[Java] Dynamic Loading' a SlashDot](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/slashdot.png)
![Add '[Java] Dynamic Loading' a Diggita Aggiungi '[Java] Dynamic Loading' a Diggita](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/diggita.png)
![Add '[Java] Dynamic Carregando' to FaceBook Aggiungi '[Java] Dynamic Loading' a FaceBook](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/facebook.png)
![Add '[Java] Dynamic Loading' a Wikio Aggiungi '[Java] Dynamic Loading' a Wikio](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/wikio.png)
![Add '[Java] Dynamic Loading' a MySpace Aggiungi '[Java] Dynamic Loading' a MySpace](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/myspace.png)
![Add '[Java] Dynamic Carregando' to Twitter Aggiungi '[Java] Dynamic Loading' a Twitter](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/twitter.png)
![Add '[Java] Dynamic Loading "a Tailrank Aggiungi '[Java] Dynamic Loading' a Technotizie](http://www.vitruviantux.net/wp-content/plugins/social-bookmarking-reloaded/technotizie.png)
Deixe uma Resposta