Java e Reflection  XML
Índice dos Fóruns » Artigos e Tutoriais
Autor Mensagem
Administrador
Java Eldar

Membro desde: 02/08/2002 12:27:02
Mensagens: 0
Offline

Assunto: Como utilizar essa poderosa API do java para saber, em tempo de execução, informações sobre classes que você não tinha conhecimento prévio. Como invocar e construir objetos destas classes?

Você pode ler este tutorial na íntegra http://www.guj.com.br/java.artigo.10.1.guj

Por favor, coloque as suas dúvidas e seus comentários sobre este tutorial aqui.
Sinta-se livre para fazer qualquer tipo de pergunta, desta maneira você estará nos ajudando e aos outros usuários!

This message was edited 1 time. Last update was at 19/07/2005 20:58:28

[Email]
fsamir
Debugger
[Avatar]
Membro desde: 04/09/2002 13:48:39
Mensagens: 71
Localização: Porto Alegre/R.S.
Offline

Opa.

Tentei utilizar reflection para inicializar variáveis, conforme o exemplo mas, não me dei bem.
Nos meus em Value Beans eu sempre crio um método init(), para "zerar" o valor da variáveis antes de utilizá-las, e executo ele no construtor do Value Bean. p. Ex.:





Eu não entendi que objeto é este que tem q ser passado para os métodos get e set do Filed.
Apelei pra tentativa-erro pra descobrir mas, sempre é disperada uma IllegalArgumentException.
O que é o maldito "field2 f2obj = new field2();" do exemplo (código abaixo)?




Abraço,

Franklin Samir Dattein
http://dattein.com
[Email] [WWW] [ICQ]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

Eh que isso eh abstrato.

O Field2, poderia ser uma String, por exemplo.
Ai voce pega uma referencia a esse campo, atraves do getField.

Depois, voce mexe nessa String, e ai, por reflection, seta essa String em determinado objeto da classe que voce esta refletindo.

Entendeu?

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
fsamir
Debugger
[Avatar]
Membro desde: 04/09/2002 13:48:39
Mensagens: 71
Localização: Porto Alegre/R.S.
Offline

Olá.

Eu até pensei ter entendido, qdo li isto na API. Só que não consegui corrigir o erro, portanto não entendi. Desculpa a minha ignorância.
Vai aí o código que dispara IllegalArgumentException:


Abraço,

Franklin Samir Dattein
http://dattein.com
[Email] [WWW] [ICQ]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

O primeiro argumento que o set recebe eh o objeto que voce quer mudar algo argumento

Tipo

campoQueEuQuero.set(instancia, novoValorDoCampo);

Entao, soh mudei uma linha do seu codigo:


http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
aleraraujo
JavaBaby
[Avatar]

Membro desde: 10/11/2002 18:42:21
Mensagens: 81
Localização: São Paulo
Offline

para fazer o Reflection de uma classe, ela tem que ter o construtor default.

[]s.

Alexandre Araújo
UP THE IRONS!!!!
[MSN]
urubatan
Moderador
[Avatar]

Membro desde: 21/09/2002 10:31:26
Mensagens: 2481
Localização: Porto Alegre/RS
Offline

para falar a verdade não,
o constructor default só facilita caso você queira instanciar a classe por reflection, mas é possivel listar os construtores, depois os parametros do mesmo e instancia-la passando um array de Object como parametro paa suprir os parametros necessários

[]'s
Rodrigo Urubatan
http://www.urubatan.com.br
Melhor livro de RoR do brasil: http://livro.urubatan.com.br
[WWW]
rocket
Thread.start()
[Avatar]

Membro desde: 06/11/2003 19:18:26
Mensagens: 44
Localização: Porto Alegre - RS - Brasil
Offline

Não pude ler o artigo e não comentar nada.
Reflection é um negócio muito legal.
Estou desenvolvendo uma arquitetura para geração de IHC baseada em três coisas legais do Java: Interfaces, carregamento dinâmico de classes e reflection.
Isso permite que eu tenha um frame (JFrame) de edição de dados de beans totalmente flexível. Este frame é instanciado em tempo de execução e ligado (via interface) a um fragmento de código genérico. Esse código, utilizando reflexão, atribui os valores corretos armazenados no bean para cada controle de tela. Essa atribuição usa reflexão (avançada eu diria), pois meu frame (e meus beans) podem ter propriedades privadas e também herdadas de classes superiores. Tudo isso é "aberto" pela reflexão e montado dinâmicamente para o usuário. O programador não faz nada.
Lento, talvez? Acho que não, fiz alguns testes iniciais e não tem diferença alguma. Usei o Log4J para testar a velocidade e a diferença de tempo ficou tão pequena (milésimos) de segundo que pode ser ignorada.

Finalmente, outra aplicação da reflexão é um esquema de gerenciamento de aplicações (vou ver se monto um artigo). Nesse esquema, o programador esqueçe coisas como "If usuario = X { controleY.setEnable(false)...}" O gerenciador se encarrega de fazer isso via reflexão e, pasmem, é muito rápido.

Bom, já falei demais. A dica é: usem e abusem de reflexão, não tenham medo, somente validem seu código muito bem.

Até,

_____________________
Prevent problems:
1. Make easy
2. Keep clean
3. Use Merlin

Marcelo Mrack mailto:mmrack@gmail.com
http://merlin.dev.java.net
http://www.3layer.com.br
[Email] [WWW] [Yahoo!] [MSN] [ICQ]
Night
Smalltalk

Membro desde: 14/05/2004 14:24:04
Mensagens: 1
Localização: Brasil
Offline

Olá..
Sou novo no fórum e comecei a programar em java a pouco tempo.
Basicamente meu problema é o seguinte:
Suponha que criei uma aplicação que contém diversos pacotes.
Eu gostaria de obter a lista das classes que pertencem a um pacote específico (pacotex).
Por exemplo, se eu tiver um pacote de acoes e quero criar uma ação que lista todas as ações possíveis.
Sem saber em que diretório estão estas ações eu não consigo descobrir quais são todas as ações.
Alguém poderia me ajudar?
Tentei entender a documentação referente a Reflection e ClassLoader mas as APIs originais não me ajudaram muito. Quanto ao tutorial do GUJ, ele não me esclareceu muita coisa.

Hugo "Night" Corbucci
[Email] [WWW] [MSN] [ICQ]
HEN_HEN
Smalltalk

Membro desde: 20/04/2006 16:22:40
Mensagens: 1
Offline

Boa tarde à todos.

Sei que já faz anos que foram postadas este artigo e comentários...
Mas a verdade é que os assuntos nunca ficarão velhos, já que JAVA ainda está fervendo.
Então, estou começando agora neste mundo de Reflection, Serializable, etc.

Com relação à duvida que o pessoal teve com um programinha, é o seguinte.

Este artigo foi uma tradução do que esta no site da SUN. Depois de algumas pesquisas, conclui que o programa correto é abaixo, pois houve uma falha do tradutor ter esquecido de mudar algumas coisas....

Segue abaixo o correto e funcionando....

import java.lang.reflect.*;

public class AlteraValor {

public double d;

public static void main( String[] args ) {

try {
Class cls = Class.forName( "AlteraValor" );

// localiza atributo da classe
Field fld = cls.getField( "d" );

// instancia um objeto da classe
AlteraValor f2obj = new AlteraValor();
System.out.println( "d = " + f2obj.d );

// seta novo valor ao atributo utilizado
fld.setDouble( f2obj, 12.34 );
System.out.println( "d = " + f2obj.d );

} // fim TRY
catch( Throwable e ) {
System.err.println( e );
}
} // fim do mpetodo MAIN
} // fim da classe AlteraValor






Abraços!!
Psycopata
JavaTeenager
[Avatar]

Membro desde: 20/04/2006 10:45:02
Mensagens: 190
Offline

Olha, eu li o tutorial, algumas publicações, mas naõ achei o que eu preciso.

Eu preciso saber uma forma de descobrir o tipo do parametro de um método de forma dinâmica. Como eu faço isso?


Vou dar um exemplo prático, para colocar dados de um ResultSet em um Benas. Daí eu preciso saber se a classe recebe um Int, umDouble ou uma String, para eu possa capturar os dados do ResultSet com o seu getInt, getDouble, GetString.

Como eu faço isso?


Já achei!!
Guerr@
Virtual Machine Man
[Avatar]

Membro desde: 03/12/2006 10:32:50
Mensagens: 521
Offline

Para ficar registrado:

method.getParameterTypes()

Uma observação:

Isso permite que eu tenha um frame (JFrame) de edição de dados de beans totalmente flexível. Este frame é instanciado em tempo de execução e ligado (via interface) a um fragmento de código genérico. Esse código, utilizando reflexão, atribui os valores corretos armazenados no bean para cada controle de tela. Essa atribuição usa reflexão (avançada eu diria), pois meu frame (e meus beans) podem ter propriedades privadas e também herdadas de classes superiores. Tudo isso é "aberto" pela reflexão e montado dinâmicamente para o usuário. O programador não faz nada.


O framework SwingBean utiliza reflaction para fazer isto e muito mais, ainda suportando a parte de tabelas, validação de dados e etc... Vale a pena dar uma olhada, pois ele agiliza bastante o desenvolvimento:

http://swingbean.sourceforge.net

Eduardo Guerra - "É Java na ponta do dedo!"
Desenvolvedor de Frameworks - Pesquisador
Editor Chefe - Revista MundoJ
Professor - Instituto Tecnológico de Aeronáutica
Me siga no Twiter!!! http://twitter.com/emguerra
[Email]
brunnoboni
Smalltalk
[Avatar]

Membro desde: 02/04/2007 16:51:58
Mensagens: 4
Localização: Manaus
Offline

Bem,comecei a programar em Java a pouco tempo e estou precisando de ajuda para um trabalho. Eu tenho que criar um web service que faça uma busca através do tipo de dado de parametros de um método ou através do tipo de dado que determinado método retorna.

Estou usando o axis como servidor Wsdl mas a minha dúvida é como faço pra ler determinado método....já criei um cliente em java e tudo só falta a parte de programação...


Desde já agradeço a ajuda


Brunno
[MSN]
Licuri
Java Ninja
[Avatar]

Membro desde: 22/12/2004 10:02:40
Mensagens: 282
Localização: SP
Offline

Galera notei no tutorial que é possivel setar valores, e no caso de pegar o valor do atributo ?
Tipo preciso pegar o valor de um atributo e setar em um outro de outra classe.
Quero montar um Form Dinamico através do meu TO.
[MSN]
K45T
Debugger
[Avatar]

Membro desde: 24/08/2006 16:14:14
Mensagens: 60
Offline

iuhyui
[WWW] [MSN]
 
Índice dos Fóruns » Artigos e Tutoriais
Ir para:   
Powered by JForum 2.1.8 © JForum Team