[Java] Dynamic Loading

Não Gravatar

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

? View Code JAVA
  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:

  1. 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;
  2. 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.

? View Code JAVA
  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):

  1. 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");
  2. 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.
  3. 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:


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.

AddThis Social Bookmark Button

Este site utiliza comentários IntenseDebate, mas eles não estão atualmente carregado porque o seu browser não suporta JavaScript, ou eles não carregar suficientemente rápido.

Deixe uma Resposta