【问题标题】:Dynamically set List<type>动态设置 List<type>
【发布时间】:2012-05-28 23:43:23
【问题描述】:

我以前只使用反射来做一些事情,比如动态获取类并在其中设置字段值。我的 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 因为每个表都会不同。

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

【问题讨论】:

    标签: java list reflection casting


    【解决方案1】:

    你不能这样做,即使你可以这样做,它也将毫无用处,因为在编译 Java 代码时,所有泛型信息都会从 Java 代码中删除,只有强制转换存在,并且因为你将使用反射,所以没有强制转换制作。

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

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 2015-04-21
      • 1970-01-01
      • 2022-12-05
      • 2018-10-19
      相关资源
      最近更新 更多