通过反射获得泛型的参数化类型

时间:2021-01-15 19:26:20

通过反射获得泛型的参数化类型
·黎活明老师贡献的一段代码:
package lqq.heima.day2;

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

public class GenericalReflection {
 
 @SuppressWarnings("unused")
 private Vector<Date> dates = new Vector<Date>();
 
 public  void setDates(Vector<Date> dates){
  this.dates = dates;
 }

 /**
  * @param args
  */
 @SuppressWarnings("unchecked")
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  final Method [] methods = GenericalReflection.class.getMethods();
  for(Method method:methods)
  {
   if(method.getName().equals("setDates")){
    final ParameterizedType pType = (ParameterizedType) method.getGenericParameterTypes()[0];
    System.out.println("setDates("
      +((Class) pType.getRawType()).getName()
      + "<"
      + ((Class)pType.getActualTypeArguments()[0])
        .getName() + ">)");
   }
  }

 }

}
实例代码:
package lqq.heima.day2;

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 ApplyGeneric {
 
 public static void applyGeneric(Vector<Date> param){
  
 }

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub
  //第一步:得到这个类中的指定的方法
  Method method = ApplyGeneric.class.getDeclaredMethod("applyGeneric", Vector.class);
  //第二步:得到该方法的泛型的{参数化类型}类ParameterizedType
  Type [] types = method.getGenericParameterTypes();
  ParameterizedType pType = (ParameterizedType) types[0];
  /*第三步:分别得到该参数化类型的原始类型和实际类型,注意实际类型可能是有多个的(如:Vector<K,V>),所以getActualTypeArguments方法返回的是一个Type类型的数组*/
  System.out.println(pType.getRawType());
  System.out.println(pType.getActualTypeArguments()[0]);
  
 }

}