package test;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Date;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Wolf{
private String name;
private List<Wolf> li = new ArrayList();
private Map<String,Date> map = new HashMap();
}
public class GenericDemo {
public static void main(String[] args) throws Exception{
Class<Wolf> clz = Wolf.class;
/*
Field [] ff = clz.getDeclaredFields();
for (Field field : ff) {
System.out.println(field);
}
*/
//获取私有属性list
Field fli = clz.getDeclaredField("li");
//忽略权限
fli.setAccessible(true);
//获取List的基本类型,没有获取到泛型
System.out.println("List基本类型 : "+fli.getType());//没有获取到泛型
//用getGenericType的方法获取到泛型类型
Type genericType = fli.getGenericType();//获取泛型类型
System.out.println("List泛型类型 : "+genericType);
//增加泛型后的类型
ParameterizedType paraType = (ParameterizedType) genericType;
//获取泛型参数列表
Type[] paraGeneric=paraType.getActualTypeArguments();
//循环取出每一个泛型
for (Type type : paraGeneric) {
System.out.println("List的泛型 : "+type);
}
//被泛型限制的类型
System.out.println("被泛型限制的类型(list) : "+paraType.getRawType());
//得到私有属性map
Field fmap= clz.getDeclaredField("map");
//忽略权限
fmap.setAccessible(true);
//用getGenericType的方法获取到泛型类型
Type genericType1 = fmap.getGenericType();
System.out.println("map的泛型类型 : "+genericType1);
//增加泛型后的类型
ParameterizedType paraType1 = (ParameterizedType) genericType1;
//获取泛型参数列表
Type[] paraGeneric1 = paraType1.getActualTypeArguments();
//循环取出每一个泛型
for (Type type : paraGeneric1) {
System.out.println("map的范型 : "+type);
}
System.out.println("被泛型限制的类型(map) : "+paraType1.getRawType());
}
}