Dúvida com reflection

10 respostas
D

E aí pessoal!

Meu problema é o seguinte, preciso pegar um objeto qualquer, obter as variáveis deste objeto e instanciar novas variáveis de acordo com os mesmos tipos das variáveis deste objeto.

Algo mais ou menos assim, só pra exemplificar:
public class Teste {
	
	int a = 0;
	String str = "abc";
	
	public static void main(String[] args) {
		ArrayList<Teste> lista = new ArrayList<Teste>();
		lista.add(new Teste());
		lista.add(new Teste());
		TesteReflection<Teste> ref = new TesteReflection<Teste>(); 
		ref.façaAlgumaCoisa(lista);
	}
}
public class TesteReflection<T> {
	
	public void façaAlgumaCoisa(ArrayList<T> lista){
	 
		for(T obj : lista){
			Field[] fields = obj.getClass().getDeclaredFields();
			for (Field field : fields){
				Type tipo = field.getType();
				
			}
		}
		
	}
}

O que eu queria fazer é criar um nova variável de acordo com o tipo do field atual.
Como posso fazer isso?

10 Respostas

Felagund
Object obj = field.getType().newInstance();

Você tem um objeto do mesmo tipo

[]'s

D

E aí Felagund !

Fiz o seguinte teste :

try { Object ob = field.getType().newInstance(); if(ob instanceof Integer){ System.out.println("inteiro"); } if(ob instanceof String){ System.out.println("String"); } } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); }

apresentou o seguinte:

java.lang.InstantiationException: int

at java.lang.Class.newInstance0(Class.java:340)

at java.lang.Class.newInstance(Class.java:308)
D

Há outro modo para tipos primitivos?

Felagund

Utilize os Wrappers java.lang.Integer
Esqueça os primitivos.

Teria que pesquisar ver se tem como. Nunca tentei com primitivos.

[]'s

D
if(field.getType == int.class){

System.out.println(inteiro);

}

Desse modo não gerou excessão, porém eu teria que ficar verificando pra todos os tipos…

T

Não pode haver referências para tipos primitivos. Digamos que você tenha um objeto Class que contenha o valor int.class (não Integer.class, que é outra coisa). Não há construtores definidos para o tipo int.

import java.lang.reflect.*;

class TesteAlocacaoTiposPrimitivos {
    // Este programa prova que tipos primitivos não têm construtores 
    // que possam ser chamados via reflection, e que 
    // tipos primitivos são distintos de seus respectivos wrappers,
    // mesmo em reflection.
    public static void main(String[] args) throws Exception {
        // Primeiramente provando que tipos primitivos são distintos
        // (mesmo via reflection) de seus respectivos wrappers.
        Class&lt;?&gt; klass1 = int.class;
        Class&lt;?&gt; klass2 = Integer.class;
        System.out.println (klass1.equals (klass2)); // imprime false

        // Como Integer não tem um construtor default (sem parâmetros), vamos
        // criar um Integer com o valor -2:
        Constructor&lt;?&gt; ci2 = klass2.getDeclaredConstructor (int.class);
        Integer i2 = (Integer) ci2.newInstance (-2); 
        System.out.println (i2); // imprime -2

        // Tipos primitivos não têm construtores que possam ser chamados via reflection.
        Constructor[] ci1 = klass1.getConstructors();
        System.out.println (ci1.length); // imprime 0, indicando que não existem construtores válidos
    }
}
T
<blockquote><div class="quote-author">danilocsf:</div>if(field.getType == int.class){

System.out.println(“inteiro”);

}

Desse modo não gerou excessão, porém eu teria que ficar verificando pra todos os tipos…

É meio braçal mesmo, mas você poderia olhar a documentação, não?
Class.isPrimitive

franciscossouza

Reflection é tão bonito e legal, pra que sujar a brincadeira com tipos primitivos?

T

Se você quer “clonar objetos”, note que nem todas as classes têm um construtor default (ou seja, nem sempre é possível usar newInstance). Muitas vezes você pode usar o método clone mesmo (como é o caso de todos os arrays, e de todos os wrappers).

D

Eu olhei a documentação, mas olhei em para o Field, Type…

As vezes vcs podem me ajudar de outra maneira…

O que eu estava precisando fazer é um TableModel genérico, minha idéia era criar uma anotação onde os dados que deveriam aparecer na tabela possuissem esta anotação e então fosse possível montar a tabela com os dados passados em um Array de qualquer objeto.

Porém pra eu recuperar os dados precisaria saber que tipo é cada dado…

Criado 24 de julho de 2009
Ultima resposta 24 de jul. de 2009
Respostas 10
Participantes 4