1 public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T> { 2 3 private T model; 4 @Override 5 public T getModel() { 6 7 return model; 8 } 9 //****给model创建对象**** 10 public BaseAction(){ 11 System.out.println("baseAction抽象类的构造方法,抽象类可以有构造方法,但不能创建实例,抽象类的构造方法存在的意义是在创建子类对象的时候,进行一定的初始化工作,如此处定义的构造方法便是这个意义"); 12 try { 13 //System.out.println("BaseAction=============="); 14 15 //使用反射创建model对象 16 //1.获取子类类型: StandardAction.class 17 //this:当前运行时的实例 18 //System.out.println(this.getClass()+"===="); 19 Class clz = this.getClass();//this指的是当前运行的实例(子类实例) 20 21 /* 22 private int a; TypeVariable 23 private int[] a; GenericArrayType 24 private Student a; WildcardType 25 private List<Student> a; ParameterizedType 26 27 */ 28 //2.获取类的泛型父类 : BaseAction<Standard> 29 //Type: 是Java里面所有类型的父接口 30 Type type = clz.getGenericSuperclass();//获取泛型父类,必须用该方法,此处的泛型父类不是指当前的类,而是具体继承的BaseAction<Standard>,当前类为BaseAction<T>泛型尚未确定 31 32 //3.把Type转换为具体的类型: BaseAction<Standard> 33 ParameterizedType pt = (ParameterizedType)type;//将泛型父类转换为具体的那种类型 34 35 //4.从具体类型中获取泛型 : Standard.class 36 //System.out.println(pt.getActualTypeArguments()[0]); 37 38 Class modelClass = (Class)pt.getActualTypeArguments()[0];//获取具体泛型类Action中的泛型 39 40 //5.创建泛型类的的对象 41 model = (T) modelClass.getConstructor().newInstance(); 42 } catch (Exception e) { 43 e.printStackTrace(); 44 } 45 } 46 }
1 /** 2 * 反射实例化泛型 3 * 4 * @throws ClassNotFoundException 5 * @throws InstantiationException 6 * @throws IllegalAccessException 7 * @throws NoSuchMethodException 8 * @throws InvocationTargetException 9 */ 10 void initModel() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { 11 ParameterizedType pt = (ParameterizedType) getClass().getGenericSuperclass(); 12 String parameterClassName = pt.getActualTypeArguments()[0].toString().split("\s")[1]; 13 Class<T> clz = (Class<T>) Class.forName(parameterClassName); 14 Constructor c = clz.getDeclaredConstructor(new Class[]{String.class}); 15 T model= (T) c.newInstance(new Object[]{parameterClassName}); 16 }