使用反射獲取泛型類型

前面在寫繞過反射對泛型直接賦值的blog中有寫到:泛型在內存中字節碼只有一份,就是編譯完成之後就沒有類型信息了,已經去類型化了。現在我們想想怎麼通過反射來獲取泛型的類型呢?由於已經去類型化了,使用普通的反射根本就獲取不了。

但是可以通過下面的方法可以獲取:

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.Vector;

public class GenericAndReflect {
 public static void main(String[] args) throws Exception{
  Vector<Date> v1 = new Vector();//獲取Vector的Date泛型,通過反射看似根本不可能
  Method method =GenericAndReflect.class.getMethod("applyVector", Vector.class);
  Type [] types = method.getGenericParameterTypes();//獲取泛型參數類型
  ParameterizedType ptype = (ParameterizedType)types[0];// 現在只有一個泛型
  System.out.println(ptype.getRawType());//getRawType()獲取自己原始類型
  System.out.println(ptype.getActualTypeArguments()[0]);//獲取實際化的類型參數
  }
 //解決的方法就是創建一個方法,把泛型的類型傳給方法  通過方法來獲取參數列表類型
 //因爲Method類中有getGenericParameterTypes()方法,這個方法是按照聲明順序返回 Type 對象的數組,
 //這些對象描述了此 Method 對象所表示的方法的形參類型的
 //還有一個方法 getParameterTypes()按照聲明順序返回 Class 對象的數組,這些對象描述了此 Method 對象所表示的方法的形參類型。
 public static void applyVector(Vector<Date> v){
  
 }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章