A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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() 方法么?

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马