Reflection

25 respostas
denisspitfire

Pessoal, li e reli mas nao vejo aplicação direta com reflection. Por favor alguem me de um exemplo bem prático pls.

25 Respostas

Rodrigo_Sasaki

GUJ - Java e Reflection

EDIT: Eu ja vi sendo utilizado pra invocar métodos dinamicamente, se não me engano na FJ-21 tem algo sobre isso, também vi um método que inicializava qualquer Objeto com valores default.

nel

O que seria uma “aplicação direta”? Tem algumas API´s do próprio JAVA que são baseadas em reflection.
Descobrir classes, métodos, atributos…tem muita coisa que é possível ser feita com o reflection. A união do generics com o reflection é uma poderosa arma do Java, na minha opinião.

luistiagos

Frameworks a maioria dos frameworks web utilizam reflection, e muitas ferramentas para automatizar o desenvolvimento… um exemplo pratico por exemplo seria se vc tem 2 beans um VO e uma classe de persistencia e precise sempre passar o valor de um para o outro… Vc pode fazer isto na mão invocando o set de um e o get do outro, ou pode fazer isto via reflection assim vc não tem o trabalho de ficar invocando gets e sets de todos os seus objetos, basta criar um metodo que faça isto por reflection, ele olha para a propria classe ve a tipagem, faz os quests se necessário e passa o valor de um para o outro automaticamente, algo que faz isto que eu mencionei é o apache BeansUtils ele trabalha 99% com reflection para isto.

guilherme.dio

Imagine que você precisa fazer algo dinâmico, por exemplo, precisa carregar objetos no java a partir de um arquivo CSV.

Então, para que seja possível ler o arquivo e em seguida carregar os atributos de um objeto de acordo com os campos do CSV, adivinha o que usar ? REFLECTION !

Olha ai um exemplo de um método de uma estrutura de classes que criei, para serializar CSV’s dinamicamente, este método reliza toda a operação, visualiza os campos e carrega os dados do csv de acordo com sua estrutura.

@Override
	public List<Object> transforma(Class<?> classe, File arquivo) throws InstantiationException, IllegalAccessException, FileNotFoundException
	{	
		//Classe para setar dados
		CampoSetter setter = new CampoSetter();
		
		//Leitura do CSV
		LeitorCSV leitor = new LeitorCSV(arquivo, ";");
		List<String> header = leitor.getHeader();
		List<Object> valores = leitor.getValores();
		
		//Lista de Objetos
		List<Object> objetos = new ArrayList<Object>();
		
		//Recupera os campos da classe
		List<Field> campos = new CampoGetter().getFields(classe);
		
		//Montagem dos objetos
		for(Object linha : valores)
		{
			//Nova instância da classe
			Object objeto = classe.newInstance();
			for(int i = 0;i < header.size();i++) 
			{
				//Varre os campos
				for(Field campoClasse : campos)
				{
					//Carrega os campos
					if(header.get(i).equals(campoClasse.getName()))
					{
						setter.setFieldValue(objeto, campoClasse, linha.toString().split(";")[i]);
					}
				}
			}
			//Adiciona na List
			objetos.add(objeto);
		}
		
		//Retorna os objetos montados
		return objetos;
	}

PS: Como vc acha que o XStream carrega um objeto para você a partir de um XML ou JSON ?..ou entao, como vc acha que os frameworks mais novos para web descobrem oque deve ser feito a partir de simples annotations ?

denisspitfire

BLZ!! agora estou começando a ver alguma vantagem!

Porque oque eu pesquisei foi, veja a estrutura, veja os metodos, veja quem criou se ele estava sentando ou em pé pra escrever o código, veja o nome da mae do programador etc etc…

Mas aplicação mesmo eu nao consigo enchergar.

Enfim, voce disse que reflections é usado para minimizar código, no caso voce usa reflection para fazer um framework. Se a classe X ve o conteudo da Y, como ela pode manipular o da Y?? E oque por exemplo?

denisspitfire

aaaaahhh agora siiiimm vlw galera

denisspitfire

guilherme.dio:
Imagine que você precisa fazer algo dinâmico, por exemplo, precisa carregar objetos no java a partir de um arquivo CSV.

Então, para que seja possível ler o arquivo e em seguida carregar os atributos de um objeto de acordo com os campos do CSV, adivinha o que usar ? REFLECTION !

Olha ai um exemplo de um método de uma estrutura de classes que criei, para serializar CSV’s dinamicamente, este método reliza toda a operação, visualiza os campos e carrega os dados do csv de acordo com sua estrutura.

@Override
	public List<Object> transforma(Class<?> classe, File arquivo) throws InstantiationException, IllegalAccessException, FileNotFoundException
	{	
		//Classe para setar dados
		CampoSetter setter = new CampoSetter();
		
		//Leitura do CSV
		LeitorCSV leitor = new LeitorCSV(arquivo, ";");
		List<String> header = leitor.getHeader();
		List<Object> valores = leitor.getValores();
		
		//Lista de Objetos
		List<Object> objetos = new ArrayList<Object>();
		
		//Recupera os campos da classe
		List<Field> campos = new CampoGetter().getFields(classe);
		
		//Montagem dos objetos
		for(Object linha : valores)
		{
			//Nova instância da classe
			Object objeto = classe.newInstance();
			for(int i = 0;i < header.size();i++) 
			{
				//Varre os campos
				for(Field campoClasse : campos)
				{
					//Carrega os campos
					if(header.get(i).equals(campoClasse.getName()))
					{
						setter.setFieldValue(objeto, campoClasse, linha.toString().split(";")[i]);
					}
				}
			}
			//Adiciona na List
			objetos.add(objeto);
		}
		
		//Retorna os objetos montados
		return objetos;
	}

PS: Como vc acha que o XStream carrega um objeto para você a partir de um XML ou JSON ?..ou entao, como vc acha que os frameworks mais novos para web descobrem oque deve ser feito a partir de simples annotations ?


voce pode colocar o arquivo de exemplo? um txt ou algo do genero?

E

Basicamente, em uma linguagem existem recursos que são adequados para quem escreve aplicações (por exemplo, você) e outros que são adequados para quem escreve bibliotecas e frameworks (por exemplo, os caras que escreveram o Spring Framework).

Reflection é uma coisa que deve ser usada, basicamente, por quem escreve bibliotecas e frameworks.

Mas isso não impede o programador de aplicações de criar aplicações que usem essas bibliotecas e frameworks e de entender como funcionam.

Por exemplo, um framework de teste muito usado que é o JUnit precisa usar reflection para determinar quais são os testes a serem executados, sem que você precise manualmente escrever a sequência desses testes (como você deve se lembrar, basta criar uma classe de teste e dizer que os métodos de teste começam por “test” ou então têm uma anotação “@Test”. Isso é um uso de reflection.

denisspitfire

mas no que ajudaria a reflection em uma classe de teste? o reflection verifica quais sao os metodos e os atributos da classe X porém, como da pra “ensinar” a classe da reflection a testar as outras classes do software. Pelo oque eu entendi é uma especie de classe testadora mas para TODO o sistema, apartir dessa “ferramenta” de reconhecimento de classes
(vish fui longe)

E

Reflection é apenas um dos recursos usados por frameworks e bibliotecas.
Alguns dos frameworks também geram código (isso depende da reflection mas vai além dela).
Só para ter uma idéia, como é que funciona um framework que mapeia um arquivo XML para uma coleção de objetos, ou vice-versa?

denisspitfire

Ok, mas digamos que eu tenha duas classes. 1 para conexao com banco de dados e a 2 para um DAO. Da pra eu criar uma classe testadora que consegue testar um DAO e uma conexao com banco usando reflection?

E

Ei, você não quer estudar o DBUnit?

http://www.dbunit.org/

luistiagos

Sim é possivel…

Rocklee6544

Reflection é quando vc quer fazer coisas como:Em tempo de execução

saber o nome dos atributos da sua classes e métodos existentes nela.

Para por exemplo montar um tabela dinâmica onde vc não sabe para qual classe ela vai servir.

(Na verdade sabe, neste caso para qualquer classe).

Vc pode fazer o que quiser com reflection porque quando usa reflection vc vêe o código java pela visão da JVM, ou mais próximo da visão dela.

No fundo muitos frameworks utilizam principalmente reflection.

Por que temos que passar para o Hibernate o molde da classe?
Simples porque o molde é a receita , a a partir dele sabemos quantos campos a classe tem

e quais métodos invocar para por exemplo dar um insert no banco.
(que nesse caso funciona para qualquer classe)

denisspitfire

d+ vlw gente agora sim ficou bem claro vou fazer uns testes e posto as shit que forem surgindo kkkk

denisspitfire

Quero fazer um software que cadastre notas fiscais, para isso ele le um xml.
Lendo esse xml, que é a estrutura da nota e suas informações… podemos usar reflection e criar uma classe que eu de o comando, grave a nota tal e ele se vira nos 30? para identificar os atributos, pegar a tabela de notas e cadastrar?
digamos que ele pega a primeira nota, tem x atributos, como ele vai pegar a nota 2 que tem y atributos e cadastrar na mesma tabela??

sao x e y atributos entre “” pois sao notas, mas algumas vem com informações que as outras nao vem. Da pra fazer? Alguma ideia?

E

denisspitfire:
Quero fazer um software que cadastre notas fiscais, para isso ele le um xml.
Lendo esse xml, que é a estrutura da nota e suas informações… podemos usar reflection e criar uma classe que eu de o comando, grave a nota tal e ele se vira nos 30? para identificar os atributos, pegar a tabela de notas e cadastrar?
digamos que ele pega a primeira nota, tem x atributos, como ele vai pegar a nota 2 que tem y atributos e cadastrar na mesma tabela??

sao x e y atributos entre “” pois sao notas, mas algumas vem com informações que as outras nao vem. Da pra fazer? Alguma ideia?

Esse é o tipo de coisas que você poderia até fazer, mas no seu caso em particular não vai economizar muito esforço. Em vez disso, use os frameworks que já existem.

denisspitfire

qual framework faz um trabalho parecido?

denisspitfire

mas eu prefiro fazer na unha primeiro para depois ver mágica… quando é mto magico nao consigo entender

E

Um software que acredito ser fácil de ler, para ver onde e como se usa reflection, é o JUnit.

denisspitfire

vlw!

denisspitfire

tem algum curso que tem muita pratica com reflection?
Apostila ou algo do genero?
Porque eu sei que tem no fj21, mas queria algo mais aprofundado no assunto, pq parece que se eu nao ver mais a fundo como as coisas funcionam eu nao entendo nem pra que serve.

nel

denisspitfire:
tem algum curso que tem muita pratica com reflection?
Apostila ou algo do genero?
Porque eu sei que tem no fj21, mas queria algo mais aprofundado no assunto, pq parece que se eu nao ver mais a fundo como as coisas funcionam eu nao entendo nem pra que serve.

Já tens um conhecimento um pouco mais “avançado” em Java ? Já conhece bem a API Collections ? Como está com Threads ? Como está com I/O ?
Se esse tipo de informação já é de seu conhecimento de forma solida, continue os estudos em Reflection, caso contrário, minha recomendação é que saiba isso antes de partir para algo mais avançado, como é o caso de Reflection e Generics.

denisspitfire

I/O e threads creio que estou bem, vou começar agora com Collections

denisspitfire

ok pessoal, como ja perguntado… alguns requisitos que eu deveria ter antes de estudar reflections. Conclui (eu acho) agora preciso estudar reflections para tentar aquela minha missao do xml.

alguem pode me dar uma dica de como posso começar?

Criado 22 de maio de 2012
Ultima resposta 4 de jun. de 2012
Respostas 25
Participantes 7