Dúvida com reflection

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:

[code]

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);
}

}[/code]


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?

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

Você tem um objeto do mesmo tipo

[]'s

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)

Há outro modo para tipos primitivos?

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

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

[]'s

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…

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
    }
}

[quote=danilocsf]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…

[/quote]

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

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

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).

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…