java - 动态设置 List<type>

标签 java list reflection casting

我以前只使用反射来做一些事情,比如动态获取类并在其中设置字段值。我的 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;
    }
}

我正在使用此方法从数据库表中动态检索结果。因为表名总是不同的,所以我不能使用 List,因为它对于每个表都是不同的。

我如何将传入的表名字符串转换为列表的类型?

最佳答案

你不能那样做,即使你可以,它也是无用的,因为所有泛型信息在编译时都从 Java 代码中删除,那里只有强制转换,因为你将使用反射,所以不会有强制转换待制作。

您将能够做的最接近的事情是,不是发送 String 而是发送 Class 对象。调用者代码必须说出它想要哪个类(调用者可能知道它使用的是哪种对象),您将使用它来使列表具有正确的泛型。

一个非常简单的实现是这样的:

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

关于java - 动态设置 List<type>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10787138/

相关文章:

python - 如何使用 python 中的第二个键对对列表进行排序?

c# - 按数字方式对 List<String[]> 进行排序

php:使用反射获取变量类型提示

html - 如何使用 Angular 7 调用与 html 中的字符串 "component name"相同的组件

java - 解析有效数字后得到垃圾?

java - 如何将 TreeModelListener 添加到 NetBeans 大纲?

erlang - 粘合二进制文件(list_to_binary)有多贵?

java - 如何检查 Map 类型是否扩展 Number

java - Ubuntu + Tomcat7.0 +jdk7, hs_err_pid%.log文件每小时不停生成

java - Android:无法实例化应用程序错误