Reflection

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

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.

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.

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.

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 ?

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?

aaaaahhh agora siiiimm vlw galera

[quote=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 ?[/quote]
voce pode colocar o arquivo de exemplo? um txt ou algo do genero?

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.

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)

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?

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?

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

http://www.dbunit.org/

Sim é possivel…

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)

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

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?

[quote=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?[/quote]

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.

qual framework faz um trabalho parecido?

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