1. 程式人生 > >反射對應泛型引數的呼叫

反射對應泛型引數的呼叫

package invokeGenerator;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Map;

import org.omg.Dynamic.Parameter;

class User{
       public Map<String,Object> map;
           
 }
 
/*
 * 獲取含泛型的欄位,獲取泛型的型別;在GeneratorDao中會用到
 */
public class Generator {
      public static void main(String[] args) throws Exception {
       Class claz = User.class;
       Field ma=claz.getField("map");
       /*獲取欄位*/
       System.out.println(ma);
       /*得到欄位名稱*/
       System.out.println(ma.getName());
        
       /*呼叫getGenericType獲取一個泛型型別 (type是所以泛型型別的介面)*/
       Type type =  ma.getGenericType();
       System.out.println(type);
       
       /*強轉為引數泛型型別*/
       ParameterizedType  paraType = (ParameterizedType) type;
       
       /*呼叫方法getActualTypeArguments;獲取到引數的泛型型別*/
       Type[]  types = paraType.getActualTypeArguments();
       System.out.println(types[0]+"***"+types[1]);
       
      /********************************操作泛型引數的方法******************************/
       /*1獲取該泛型引數方法所在類的class物件(以Arrays為例子)*/
       
       Class array = Arrays.class;
       
       /*2.由於不知道具體方法的具體引數型別所以這裡先獲取所有方法,然後篩選需要測試的方法*/
       
       Method[]  arrayMetods = array.getMethods();
         
       /*遍歷獲取的方法陣列,通過方法名篩選測試的方法*/
       Method asList = null;
       for(Method method:arrayMetods){
           if("asList".equals(method.getName())){
           asList = method;
           System.out.println(method);
           }
           
         //  System.out.println(method);
       }
       
       /*3呼叫方法*/
       /*注意不定引數的傳遞方式*/
        System.out.println(asList.invoke(null, new Object[]{new Object[]{"a","b","c","d"}}));
       
    }
}