java - 泛型 - 从 Class<T> 获取值

标签 java generics jpa reflection

我有一个类可以将我的 jpa 实体转换为 TO,反之亦然。

当我在方法 convertEntityListInTOList 中进行转换时,List返回的是 List<Class<T>>我需要的是 List<T> .

是否可以迭代此集合( List<Class<T>> )并获取“TO”值?

转换器

    public class MyConverter<E, T> implements Serializable {

        private Class<E> myEntity;
        private Class<T> myTO;

        public MyConverter(Class<E> myEntity, Class<T> myTO) {
            this.myEntity = myEntity;
            this.myTO = myTO;
        }

        public List<T> convertEntityListInTOList(List<E> entityList) {
            List<T> listTO = new ArrayList<T>();
            for(E obj : entityList) {
                myTO = convertEntityInTO(obj);
                listTO.add(myTO);
            }               
            return listTO;
        }

        public List<E> convertTOListInEntityList(List<T> listTOs) {
            List<E> entityList = new ArrayList<E>();
            for(T to : listTOs) {
                myEntity = convertTOInEntity(to);
                entityList.add(myEntity);
            }           
            return entityList;
        }

        public T convertEntityInTO(Object myEntity) {
            T myTO = createInstanceTO();
            if(myEntity != null) {
                try {
                    BeanUtils.copyProperties(myTO, myEntity);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
            return myTO;
        }

        public E convertTOInEntity(T myTO) {
            E myEntity = createInstanceEntity();
            if(myTO != null) {
                try {
                    BeanUtils.copyProperties(myEntity, myTO);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }    
            return myEntity;    
        }

/**
     * 
     * @return
     */
    public T createInstanceTO() {
        try {
            return getMyTO().newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 
     * @return
     */
    public E createInstanceEntity() {
        try {
            return getMyEntity().newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

}

转换器生产商

@Produces
public MyConverter create(InjectionPoint ip) {
    ParameterizedType type = (ParameterizedType) ip.getType();
    Class myEntity = (Class) type.getActualTypeArguments()[0];
    Class myTO = (Class) type.getActualTypeArguments()[1];
    return new MyConverter(myEntity, myTO);
}

最佳答案

您的代码存在很多问题。您正在混合对象(例如 MyEntity 类型的对象)和表示这些对象的类的对象(例如 Class<MyEntity> )。

所以,当你写

Class myEntity = (Class) type.getActualTypeArguments()[0];
    Class myTO = (Class) type.getActualTypeArguments()[1];
    return new MyConverter(myEntity, myTO);

您正在尝试创建一个转换器来转换 Class进入另一个Class ,这没有意义。这就是为什么返回类型为 convertEntityListInTOList是一个类列表。

创建一个包含每个实体的一个实例的转换器也没有意义。您应该每次创建一个新实例,或者填充作为参数传递给转换方法的实例。

关于java - 泛型 - 从 Class<T> 获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24918525/

相关文章:

java - Java 相当于 C 的 fflush? [读取值时出现问题]

java - 如何从 CustomAdapter 调用 Activity 中的方法

时间:2019-03-17 标签:c#Linq to SQL and Generics

java - JPA 容器持久单元与 JPA 非容器持久单元

hibernate - 如何查询以二进制形式存储在数据库中的 UUID(JPA/Hibernate/MySQL)

google-app-engine - Google App Engine : When calling persist(. ..) 上的 JPA,它总是发生在事务中吗?

java - 计算阶乘

java - 从通用抽象类java返回子类

java - 泛型是否始终提供类型安全以及在哪些最佳用例下

java - 布局问题;重叠按钮