Met*_*ing 5 java reflection casting list
我以前只使用反射来做动态获取类和设置字段值的事情.我的Google搜索向我展示了我还可以使用反射进行动态类型转换?
我的代码如下:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用此方法动态检索数据库表中的结果.因为表名总是不同的,所以我不能拥有List,因为每个表都不同.
我如何将我传入的tablename字符串转换为List的类型?
你不能这样做,即使你可以,它也没用,因为所有的泛型信息在编译时从Java代码中删除,只有强制转换就在那里而你正在使用反射就不会有强制转换.
您能够做的最接近的事情是,而不是发送一个String发送一个Class对象.调用者代码必须说出它想要的类(调用者可能知道它正在使用什么类型的对象),并且您将使用它来使列表具有正确的泛型.
一个非常简单的实现将是这样的:
List<Shipvia> shipvias = RetrieveResultList.retrieveResultList( Shipvia.class );
Run Code Online (Sandbox Code Playgroud)
实现可能是这样的:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后你应该有类似于你正在寻找的东西.
另外,不要在每次调用此方法时创建实体管理器工厂,实体管理器工厂必须是项目中的单件,因为它是一个非常昂贵的对象.您还应该在离开方法之前关闭您创建的EntityManager.