import java.util.*;
import java.lang.reflect.*;
public class GenericTest
{
private Map<String , Integer> score;
public static void main(String[] args) throws Exception
{
Class<GenericTest> clazz = GenericTest.class;
Field f = clazz.getDeclaredField("score");
//直接使用getType()取出Field类型只对普通类型的Field有效
Class<?> a = f.getType(); //1.返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。
System.out.println("score的类型是:" + a);
//获得Field实例f的泛型类型
Type gType = f.getGenericType(); //2.返回一个 Type 对象,它表示此 Field 对象所表示字段的声明类型。
System.out.println("gType...."+gType);
//如果gType类型是ParameterizedType对象
if(gType instanceof ParameterizedType)
{
//强制类型转换
ParameterizedType pType = (ParameterizedType)gType;
//获取原来类型
System.out.println("强制ParameterizedType转换之后:"+pType);
Type rType = pType.getRawType();
System.out.println("原始类型是:" + rType);
//取得泛型类型的泛型参数
Type[] tArgs = pType.getActualTypeArguments();
System.out.println("泛型类型参数是:");
for (int i = 0; i < tArgs.length; i++)
{
System.out.println("第" + i + "个泛型类型参数是:" + tArgs[i]);
}
}
else
{
System.out.println("获取泛型类型出错!");
}
}
}
问题1: 注释行//1 和//2 中 都是操作Filed字节码对象,怎么区分两者? 难道仅仅是返回类型的不同?
问题2:其实我们直接输出gType: gType....java.util.Map<java.lang.String, java.lang.Integer>就已经能够看出来 Filed的参数类型,后面强转成ParameterizedType难道仅仅是为了使用ParameterizedType中的 getRawType()和getActualTypeArguments() 方法么?
|
|