反射動態創建泛型類中泛型對應類的實例


 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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM