package com.interview.getGenericArgument;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
* 通过反射技术得到泛型的实际类型参数
* @author dhh
*
*/
public class GetGernericArgument {
public static void main(String[] args) {
List<Date> lists = new ArrayList<Date>();
List<String> lists2 = new ArrayList<String>();
/**
* 如果想通过lists,lists2来得到lists的实际类型参数(也就是Date)
* 这是不能实现的,因为泛型就是编译器用来防止开发者不按实际类型胡乱
* 添加。它编译完之后成class之后,将没有泛型这个概念,
* 因为lists.getClass()==list2.getClass()
* 但是如果要得到方法里面的实际类型参数,就可以实现
*/
//得到getActualArgument方法的实际类型参数
try {
Method method =
GetGernericArgument.class.getMethod("getActualArgument", ArrayList.class,HashMap.class);
//得到所有泛型参数类型,不能用method.getParameterTypes(),因为class中不包含泛型类型
Type[] types = method.getGenericParameterTypes();
System.out.println("**---------第一个参数-------**");
//Type包含很多种,我们要得到参数化的Type.ParameterizedType 表示参数化类型,如 Collection<String>
ParameterizedType paramType = (ParameterizedType)types[0];
//返回 Type 对象,表示声明此类型的类或接口(原始类型)
System.out.println(paramType.getRawType());
//得到第一个参数的类型,如果是HashMap<K,V>将会有两个参数
//返回表示此类型实际类型参数的 Type 对象的数组。
System.out.println(paramType.getActualTypeArguments()[0]);
System.out.println("**---------第二个参数-------**");
//Type包含很多种,我们要得到参数化的Type.ParameterizedType 表示参数化类型,如 Collection<String>
ParameterizedType paramType2 = (ParameterizedType)types[1];
System.out.println(paramType2.getRawType());
System.out.println(paramType2.getActualTypeArguments()[0]);
System.out.println(paramType2.getActualTypeArguments()[1]);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 通过方法得到参数的实际类型参数
* @param lists
* @param maps
*/
public void getActualArgument(ArrayList<Date> lists,HashMap<Integer, String> maps){}
}
反射==>获得泛型的实际类型参数
最新推荐文章于 2021-11-20 11:19:28 发布