2012-05-28 68 views
5

我以前只使用反射來做動態獲取類和設置字段值的內容。我的Google搜索向我展示了我也可以使用反射進行動態類型轉換?動態設置列表<type>

我的代碼如下:

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

我使用這個方法來動態檢索從數據庫表中的結果。因爲表名總是不同的,所以我不能擁有List,因爲它對於每個表都是不同的。

我該如何去轉換我傳入的表名字符串,作爲List的類型?

回答

5

你不能這樣做,即使你可以,它也沒用,因爲所有的泛型信息在編譯時從Java代碼中刪除,只有強制轉換會在那裏,因爲你會使用反射,投下來。

,你將能夠做的最接近的事是,而不是在一個字符串發送發送對象。調用者代碼將不得不說明它想要哪個類(調用者可能知道它使用的是什麼類型的對象),並且您將使用它來使列表具有正確的泛型。

一個非常簡單的實現方式是這樣的:

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

而且實現可能是這樣的:

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

然後,你應該有一些像你在找什麼。

此外,不要創建在每次調用該方法的實體管理器工廠,實體管理器工廠必須在你的項目中一個單身,因爲它是一個非常昂貴的對象創建。您還應該關閉您在離開方法之前創建的EntityManager