alguém explica o que faz uma parte desse código?

5 respostas
0

Bom Dia Galera!

Implementei uma classe DAO generica para realizar operações em um banco.

Só não consegui entender o o que faz uma parte classe, é o seguinte:
Tenho uma variável final ‘oClass’ na minha classe do tipo Class, no construtor da minha classe eu inicializo essa variavel com uma linha de código que não entendi, alguém pode me explicar o que essa linha ta fazendo? O que minha variavel oClass do tipo Class esta recebendo com essa inicialização?
Se puderem me detalhar o máximo possivel, pois sou iniciantes e algumas vezes algumas coisas não ficam tão claras.

a classe é essa

public class GenericDAOImp<T, ID extends Serializable> implements GenericDAO<T,ID>  {

	public EntityManagerFactory emf;
	private EntityManager em = null;
	public EntityTransaction et;
	
	private final Class<T> oClass;
	
	public GenericDAOImp() {
		this.oClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
		emf = Persistence.createEntityManagerFactory("persistencia");
	}
	
	public Class<T> getOClass() {
		return oClass;
	}

	public EntityManager getEm() {
		return em;
	}


	public void setEm(EntityManager em) {
		this.em = em;
	}
	
	/*public void Teste(){
		em = emf.createEntityManager();
		ArrayList<CdUsers> listaCd = (ArrayList<CdUsers>) em.createQuery("select c from CdUsers c").getResultList();
		for(Iterator iter = listaCd.iterator(); iter.hasNext();){
			CdUsers cd = (CdUsers) iter.next();
			System.out.println("valor: "+cd.getIdUser());
		}
		em.close();
		
	}*/

	@Override
	public Class<T> getObjectClass() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<T> listPesq(String query) {
		
		em = emf.createEntityManager();
		
		Query q = getEm().createQuery(query);
		
		List<T> lista = q.getResultList();
		
		em.close();
		
		return lista;
	}

	@Override
	public List<T> listPesqParam(String query, Map<String, Object> params) {

		em = emf.createEntityManager();
		
		Query q = getEm().createQuery(query);
		
		for(String chave:params.keySet()){
			q.setParameter(chave, params.get(chave));
		}
		
		List<T> lista = q.getResultList();
		
		em.close();
		
		return lista;
	}

	@Override
	public T pesqParam(String query, Map<String, Object> params) {

		
		em = emf.createEntityManager();
		
		Query q = getEm().createQuery(query);
		
		for(String chave:params.keySet()){
			q.setParameter(chave, params.get(chave));
		}
		try{
			T valor = (T) q.getSingleResult();
			
			em.close();
			
			return valor;
		}catch(NoResultException nre){
			
			em.close();
			
			return null;
		}
		
		
	}

	@Override
	public T pesquisaPorId(ID id) {
		em = emf.createEntityManager();
		T valor = getEm().find(oClass, id);
		em.close();
		return valor;
	}

	@Override
	public List<T> todos() {
		String queryS = "SELECT obj FROM "+oClass.getSimpleName()+" obj";
		em = emf.createEntityManager();
		
		Query query = getEm().createQuery(queryS);
		
		List<T> lista = query.getResultList();
		
		em.close();
		return lista;
	}
	
}

a linha que não consigo entender é essa, dentro do construtor

this.oClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

Se alguém puder me explicar certinho,

Desde já agradeço

5 Respostas

Giulliano

vc esta dizendo que sua varíavel oClass é do tipo que foi colocado no ligar do T em tempo de execução.

facholi

Olá,

Procure por ParameterizedType aqui http://java.sun.com/javase/6/docs/api/ e depois veja o método getActualTypeArguments().

a explicação tah bem legal prá saber como funciona. :wink:

Marky.Vasconcelos

Voce não entendeu como o valor foi atribuido ou o que esse Class faz?

0

não entendi o que esta sendo atribuido.
E também não esta funcioando, se puder me ajudar

valeu

sergio_ferraz

É uma forma de usar reflexão com informações genéricas. O metodo getActualTypeArguments() retorna um array dos tipos dos argumentos do tipo parametrizado GenericDAOImpl. Ou seja, retorna um Class real referente ao T genérico.

Criado 2 de dezembro de 2008
Ultima resposta 2 de dez. de 2008
Respostas 5
Participantes 5