2012-05-28 16 views
5

In precedenza ho usato solo il riflesso per fare cose come ottenere in modo dinamico classe e impostare valori di campo in esso. La mia ricerca su Google mi ha mostrato che potrei anche usare la riflessione per il casting di tipo dinamico?Imposta dinamicamente Elenco <type>

Il mio codice è il seguente:

import entity.Shipvia; 
import entity.Route; 
import java.lang.reflect.Field; 
import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.Persistence; 
import javax.persistence.Query; 

public class RetrieveResultList { 

    public static List retrieveResultList(String tablename) { 
     EntityManager entityManager = Persistence.createEntityManagerFactory("EntityLibraryPU").createEntityManager(); 
     Query query = entityManager.createNamedQuery(tablename + ".findAll"); 
     List<Shipvia> resultList = query.getResultList(); 
     return resultList; 
    } 
} 

Sto usando questo metodo seguito da una tabella del database per recuperare in modo dinamico. Poiché il nome della tabella è sempre diverso, non posso avere List poiché sarà diverso per ogni tabella.

Come dovrei fare per convertire la stringa del tablename in cui sto passando, per essere il tipo di List?

risposta

5

Non puoi farlo e anche se tu potessi, sarebbe inutile dato che tutte le informazioni sui generici sono rimosse dal codice Java quando è compilato, solo i calchi sarebbero lì e come useresti il ​​riflesso non ci sarebbe calchi da realizzare.

La cosa più vicina si sarà in grado di fare è, invece di inviare in un String inviare un oggetto Class. Il codice del chiamante dovrebbe dire quale classe vuole (il chiamante probabilmente sa che tipo di oggetto sta usando) e lo useresti per fare in modo che la lista abbia il generico corretto.

Un molto semplice implementazione sarebbe qualcosa di simile a questo:

List<Shipvia> shipvias = RetrieveResultList.retrieveResultList(Shipvia.class); 

e l'attuazione potrebbe essere qualcosa di simile:

public class RetrieveResultList { 

    private static final EntityManagerFactory FACTORY = Persistence.createEntityManagerFactory("EntityLibraryPU"); 

    public static <T> List<T> retrieveResultList(Class<T> type) { 
     EntityManager entityManager = FACTORY.createEntityManager(); 
     String tablename = type.getName(); // figure out table name from **type** 
     Query query = entityManager.createNamedQuery(tablename + ".findAll"); 
     List<T> resultList = query.getResultList(); 
     entityManager.close(); 
     return resultList; 
    } 
} 

E allora si dovrebbe avere qualcosa di simile a quello che stai cercando.

INOLTRE, non creare una fabbrica di un'entità responsabile in ciascuna chiamata a questo metodo, la fabbrica entità manager deve essere un singleton nel progetto in quanto è un oggetto molto costoso per creare. Dovresti anche chiudere il EntityManager che hai creato prima di lasciare il metodo.

Problemi correlati