package cn.lhzd.tool; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; /** * 获取子类传递的泛型对象 * clazz 继承者对象的:为(this.class) * return 泛型数组中的对象 */ @SuppressWarnings("rawtypes") public class ClassTool { public static Class GenericInstantiation(Class clazz) { //返回clazz的父类类型。 Type type = clazz.getGenericSuperclass(); //转为Type的子类ParameterizedType类,通过它可以获取到对象 类型的泛型数组 ParameterizedType parameter = (ParameterizedType) type; //获取对象obj<T>中的泛型对象。如<User,Order>,0索引表示第一个user clazz = (Class) parameter.getActualTypeArguments()[0]; //返回给调用者 return clazz; } }
让action继续BaseAction类。package cn.lhzd.web.action; import javax.servlet.ServletContext; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import org.apache.struts2.util.ServletContextAware; import cn.lhzd.tool.ClassTool; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; /** * Action工具类 * 1:使用action继续此类,只需要传递模型对象,即可。 * 2:拥有request,response,context * 3:子类调用getModel();可获取到 表单封装数据后模型对象。 * * @param <T> 模型对象 */ @SuppressWarnings({ "unchecked", "serial","rawtypes","unused"}) public class BaseAction<T> extends ActionSupport implements ModelDriven<T>,ServletRequestAware,ServletResponseAware,ServletContextAware { //用于接收继承者传递的泛型对象 private T obj; //作用域 private ServletRequest request; private ServletResponse response; private ServletContext context; //通过子类先实例化父构造方法,创建泛型对象,做为模型驱动对象。 public BaseAction() { Class clazz = ClassTool.GenericInstantiation(this.getClass()); try { obj = (T) clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } } public T getModel() { return obj; } public void setServletResponse(HttpServletResponse response) { this.response = response; } public void setServletRequest(HttpServletRequest request) { this.request = request; } public void setServletContext(ServletContext context) { this.context = context; } }
原文:http://blog.csdn.net/hubiao_0618/article/details/19775139