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 }