Array de Objeto

8 respostas Resolvido
M

Pessoal, boa noite

Tem como dentro de um array de objeto que recebe meu retorno do getResultList() ler todos valores apenas do tipo date e fazer um determinado tratamento que preciso e devolver para mesmo array já tratado.

Abs

8 Respostas

Dragoon

sim.

TalonNoxus

A Reflection API resolve o seu problema.

A Reflection API do Java permite que as classes conheçam sobre as suas estruturas internas.
O ponto de entrada é um objeto Class, que guarda informações sobre uma classe.

Aqui um exemplo pratico:

public static void executar(MinhaClasse mc) throws Exception
	{
		Class<MinhaClasse> c = MinhaClasse.class;//Objeto c pega uma referencia da classe MinhaClasse, ou seja, c representa a classe
		
		Method[] methods = c.getDeclaredMethods();//Pegando os métodos da classe MinhaClasse
		
		for(Method m : methods)
		{
			if(m.getReturnType().isAssignableFrom(int.class))//Se o tipo de retorno for int então exibirá uma mensagem na tela
			{
				System.out.println("Sim, o tipo de retorno é " + m.getReturnType());
			}
			
			
		}
	}
M

Então cara

Não retornou nada do tipo Date…estou fazendo da seguinte forma:

public List<AgendamentoDTO> getByAgendamento(int idEmpresa) {
    
    this.em = EntityManagerUtil.build().createEntityManager();
    
    StringBuilder SQL = new StringBuilder();        
    List<AgendamentoDTO> collection = null;

    try {
        SQL.append(" SELECT * FROM AGENDAMENTO ");
        SQL.append(" WHERE ID_EMPRESA = ?1");
        SQL.append(" ORDER BY DT_INIAGENDA ");

        Query query = em.createNativeQuery(SQL.toString(), AgendamentoDTO.class);
        collection = query.setParameter(1, idEmpresa).getResultList();

    } catch (Exception e) {
        collection = null;
    } finally {
        em.close();
    }

    return collection;
}

public static void main(String[] args) {
    Class<MinhaClass> c = MinhaClass.class;//Objeto c pega uma referencia da classe MinhaClasse, ou seja, c representa a classe
    Method[] methods = c.getDeclaredMethods();//Pegando os métodos da classe MinhaClasse
    for (Method m : methods) {
        if (m.getReturnType().isAssignableFrom(Date.class))//Se o tipo de retorno for date então exibirá uma mensagem na tela
        {
            System.out.println("Sim, o tipo de retorno é " + m.getReturnType());
        }
    }
}
TalonNoxus

Se vc quer ler métodos, era pro if funcionar, mas se é atributos, então troca tudo que é Method por Field

Class <MinhaClasse> c = MinhaClasse.class;//Objeto Class, é um objeto que representa a classe
		
		Field[]fields = c.getDeclaredFields();
		for(Field f : fields)
		{
			if(f.getType().isAssignableFrom(Date.class))
			{
				System.out.println(f.getName() + " -> " + f.getType());//Nome do atributo -> tipo
			}
		}
M

Exato o que eu fiz, usando field eu consegui fazer o teste para saber se é do tipo Date…agora a dificuldade esta sendo pegar o valor do field, formata-lo e retornar para o mesmo já formatado.

Será que essa é a melhor maneira de aplicar mascara para todos meus atributos?

Obrigado pelo retorno.

TalonNoxus

Nesse exemplo eu alterei os atributos canal e codigoDeFabricante para 30.
Isso funcionará caso o modificador seja public

Televisao televisao = new Televisao();//Instancia de televisao
		Class c = televisao.getClass();//Objeto Class, é um objeto que representa a classe
		
		Field[]fields = c.getDeclaredFields();
		
		for(Field f : fields)
		{
			if(f.getType().isAssignableFrom(int.class))
			{
				f = c.getDeclaredField(f.getName());//Pegando no nome do atributo
				f.set(televisao, 30);//Passando o objeto que sofrerá alteração no atributo, e o valor
			}
		}
		System.out.println(televisao.getCanal() + ", " + televisao.getCodigoFabricante());
TalonNoxus

Eu fiz um exemplo mais complexo, qualquer coisa só perguntar.

Classe Televisao
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Televisao <T>
{
	private int canal;
	
	public void setCanal(Integer novoCanal)
	{
		canal = novoCanal;
	}
	
	public int getCanal()
	{
		return canal;
	}
	
	public void set(Object obj, String atributo, T valor) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
	{
		Class c = obj.getClass();
		
		/*
		 * Na programação, nós seguimos algumas conveções, uma delas é a convenção Setter e Getter(que você ja deve conhecer)
		 * então para dar um valor a um atributo que segue essa convenção, fazemos set + NomeDoAtributoComPrimeiraLetraMaiuscula
		 * que é o que eu estou fazendo abaixo
		 */
		String atributo2 = "set" + Character.toUpperCase(atributo.charAt(0));//Nesse exemplo o variavel(atributo2) possui o valor setC. o C é de canal
		atributo = atributo.substring(1);//Nesse exemplo o variavel(atributo) possui o valor anal. pois eu falei que ele teria o valor da segunda letra(indice 1) em diante.

		
	                 String nomeMetodo = atributo2 + atributo;//Juntando o setC com o anal, que resultará setCanal
		         Method method = c.getDeclaredMethod(nomeMetodo, valor.getClass());//Passando o nome do metodo e o tipo do parâmetro como parâmetro
		
		         method.invoke(obj, valor);//invocando o método, passando o obj que terá o seu valor alterado e o valor
		
	         }
	
	public T get(Object obj, String nomeMetodo) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
	{
		Class c = obj.getClass();
		
		Method m = c.getDeclaredMethod(nomeMetodo);//Recebendo o nome do método
		return (T) m.invoke(obj);//Invocando o método
		
	}
}

Classe que possui o método main
[code]
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Aplicacao
{

public static void main(String[] args) throws Exception
{
Televisao televisao = new Televisao();//Instancia de televisao
Class c = televisao.getClass();//Objeto Class, é um objeto que representa a classe


Field[] fields = c.getDeclaredFields();
for(Field f: fields)
{
if(f.getType().isAssignableFrom(int.class))
{
televisao.set(televisao, f.getName(), 30);//Passando o próprio objeto, o nome do atributo e o valor como parâmetros
}
}

Method[] methods = c.getDeclaredMethods();
for(Method m : methods)
{
if(m.getReturnType().isAssignableFrom(int.class))
{
System.out.println(televisao.get(televisao, m.getName()));//Passando o próprio objeto e o nome do método como parâmetros
}
}

}

}
[/code

M
Solucao aceita

Cara muito obrigado…salvo meu dia!

Att,

Criado 7 de setembro de 2016
Ultima resposta 12 de set. de 2016
Respostas 8
Participantes 3