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
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
sim.
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());
}
}
}
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());
}
}
}
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
}
}
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.
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());
Eu fiz um exemplo mais complexo, qualquer coisa só perguntar.
Classe Televisaoimport 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
Cara muito obrigado…salvo meu dia!
Att,