代码背景:在物流项目中,有大量的action类中需要使用模型驱动,所以会抽取公共部分代码,
但由于action类要实现ModelDriven<T>接口,抽取成BaseAction里面的泛型T如何在子类实例化的问题。
/**
* 抽取Action的公共代码 ,简化开发
*
* @author dijia478
* @version 1.0,2017-10-30 11:16
*/
public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
/** 模型驱动 */
protected T model;
@Override
public T getModel() {
return model;
}
/**
* 构造器 完成model实例化
*/
public BaseAction() {
// 构造子类Action对象 ,获取继承父类型的泛型
// AreaAction extends BaseAction<Area>
// BaseAction<Area>
Type genericSuperclass = this.getClass().getGenericSuperclass();
// 获取类型第一个泛型参数
ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
Class<T> modelClass = (Class<T>) parameterizedType.getActualTypeArguments()[0];
try {
model = modelClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
System.out.println("模型构造失败...");
}
}
}
这段代码是通过构造器来实例化泛型T的,子类要继承BaseAction,加载子类的时候,子类构造默认会调用supper();,所以会将泛型T实例化