通过反射获取泛型实例

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.BeanUtils;


/**
 * 提供两种bean之间的值拷贝
 * M:值提供者,E:值接受者
 * 必须要有子类继承才能获取泛型参数,
 * 否则会报java.lang.Class cannot be cast to java.lang.reflect.ParameteriedType
 * 可以通过创建空实现的匿名类来处理:BeanConvertUtils<M, E> convertUtils = new BeanConvertUtils<M, E>(){};
 * BeanConvertUtils.java
 * @author 	  steveguoshao
 * @takeOver 	
 * @created   2014年1月9日 下午7:33:34
 * @version   1.0
 */
public abstract class BeanConvertUtils<M extends Serializable, E extends Serializable> {

	/**
	 * 提供两种bean之间的值拷贝  M:值提供者,E:值接受者
	 * getBeanList
	 * @param modelList
	 * @return 
	 * List<E>
	 * @exception 
	 * @since  1.0.0
	 */
	public List<E> getBeanList(List<M> modelList) {
		List<E> entityList = new ArrayList<E>();
		if(modelList!=null){
			for(M model : modelList) {
				entityList.add(getBean(model));
			}
		}
		return entityList;
	}
	
	/**
	 * 提供两种bean之间的值拷贝  M:值提供者,E:值接受者
	 * getBean
	 * @param model
	 * @return 
	 * E
	 * @exception 
	 * @since  1.0.0
	 */
	@SuppressWarnings("unchecked")
	public E getBean(M model) {
    	// 通过反射获取注解“E”(即模型对象)的类型,
		// 这里必须要有子类继承才能获取,否则会报java.lang.Class cannot be cast to java.lang.reflect.ParameteriedType
		// 索引0为第一个泛型M,索引1为第二个泛型E,依次类推
		Class<E> entityClass = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1];
        E entity = null;
        try {
        	entity = (E) entityClass.newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
        if(model==null){
        	return null;
        }else{
        	BeanUtils.copyProperties(model, entity);
        }
        return entity;
    }
}

你可能感兴趣的:(通过反射获取泛型实例)