| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/07/2005 19:57:34
|
Guilherme Silveira
Administrador
Membro desde: 14/08/2002 10:09:26
Mensagens: 1096
Localização: Sao Paulo
Offline
|
estou usando o janino para compilar algumas classes em tempo de execucao e ele me devolve um classloader com o qual eu tenho acesso a essas classes compiladas.
para alterar o classloader do sistema em tempo de execucao so achei a alternativa que usa reflection para alterar a variavel estatica scl da classe ClassLoader (*entenda como gambiarra total*)
na verdade quero alterar o classloader para uma parte especifica do programa, mas o meu codigo deve funcionar como algo plugavel: nao posso alterar a linha de comando nem nada. tem que ser so de colocar o jar no classpath ele faz isso tudo sozinho
no momento estou notificando os outros componentes sobre classloader novo para que utilizem ele em suas reflections
|
-------------------------------------------------------
Guilherme Silveirahttp://blog.caelum.com.br
 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/08/2005 12:07:22
|
Filipe Sabella
GUJ Expert
Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline
|
Recomendo o livro Java Reflection in Action.
|
Former LIPE. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/08/2005 18:27:04
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
Guilherme explica melhor o teu problema, não ficou claro.
Eu entendi é que você precisa que os seus componentes saibam da existencia das classes geradas, correto? Class.forName funcionar, por exemplo.
Se for isso a solução mais facil é você deixar a parte de geração de classes toda no classloader normal da aplicação e o resto carregar atraves do classloader do janino. Pra isso você vai precisar de um método ponte que muda a execução do classloader da aplicação para o classloader do janino que só pode ser feito usando reflection.
Isso que eu falei é factivel e facil de fazer em J2SE, já com J2EE fica um pouco mais chato.
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/08/2005 21:59:15
|
Guilherme Silveira
Administrador
Membro desde: 14/08/2002 10:09:26
Mensagens: 1096
Localização: Sao Paulo
Offline
|
Entao louds, eu acho que fiz o que voce falou.
Eu acessei o field private static chamado scl do ClassLoader e alterei para o do janino e com composicao fiz acessar os outros. Mas isso eh feio pra burro, nojento, mal educado etc e tal nao acha.... acessando um private static....
O Reflection in Action fala disso Lipe (ponto de interrogacao)
Nao gosto da serie in Action por causa do struts e do hibernate, o reflection eh bom (PI)
ps: teclado ruim
|
-------------------------------------------------------
Guilherme Silveirahttp://blog.caelum.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/08/2005 22:14:00
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2667
Localização: Chicago, EUA
Offline
|
Fala Guilherme,
Esse era o meu problema original, mas como o Tomcat faz isso pra mim eu ignorei.
Essa sua solução de alterar o classloader por reflection funciona para classes que já tinham sido carregadas ??? Por exemplo vc carregou uma class A e depois alterou o código dela e recompilou ela. O problema é que o classloader já carregou essa classe e já guardou isso num cache, ou seja, vai ignorar a mudança.
Vc teve esse problema?
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/08/2005 23:43:04
|
Guilherme Silveira
Administrador
Membro desde: 14/08/2002 10:09:26
Mensagens: 1096
Localização: Sao Paulo
Offline
|
nem cheguei a pensar nisso. vi que era muita gambiarra logo de cara e tentei outros caminhos mais polidos
|
-------------------------------------------------------
Guilherme Silveirahttp://blog.caelum.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/08/2005 00:00:17
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2667
Localização: Chicago, EUA
Offline
|
O problema é que os classloaders usam um classloader (encadeado) embaixo que cacheia tudo. A única solução que eu vi na Net é vc usar um classloader que não delega pra baixo, ou seja, (acho) que dá um defineClass ele mesmo. Depois vc joga esse classloader fora e usa outro. Aí a classe é carregada novamente. (ela e todo o resto que depende dela )
Não sei se tem solução bonita pra isso não... Eu achei que o Tomcat fazia isso, mas pelo que to vendo ele força um restarte de tudo e não apenas o reload de uma classe...
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/08/2005 07:23:17
|
Guilherme Silveira
Administrador
Membro desde: 14/08/2002 10:09:26
Mensagens: 1096
Localização: Sao Paulo
Offline
|
a estrutura de delegar do classloader eu vi, claro. mas tentei resolver a situacao dcom dois classloaders diferentes ao mesmo tempo ai parece que deu, mas como disse ficou muito feio.
o tomcat precisa dar um reload em toda a aplicacao (eh isso?) pq se ele deixa algo para tras nesse reload de classes pode ficar tudo incompativel. sem contar que ele teria que manter para cada classe qual foi o ultimo horario de reload, mto chato e nao faz mto sentido para uma aplicacao web.
se nao me engano o reload nem eh padrao do j2ee, alguem confirma? (pelo menos nao li na especificacao)
|
-------------------------------------------------------
Guilherme Silveirahttp://blog.caelum.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/08/2005 09:49:58
|
Filipe Sabella
GUJ Expert
Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline
|
Eu achei bastante bom, já que manjava absolutamente nada de classloading em Java. No capítulo pertinente o autor constói um classloader
Ele aborda outros temas além da API de Reflection, e bem aplicado. Achei ótimo.
|
Former LIPE. |
|
|
 |
|
|