黑马程序员技术交流社区

标题: 通过反射来获取了泛型的实际参数的类型 不解 求大神简单... [打印本页]

作者: 毛羚杨    时间: 2014-2-12 15:18
标题: 通过反射来获取了泛型的实际参数的类型 不解 求大神简单...
public static void main(String[] args) throws SecurityException, NoSuchMethodException {
                // TODO Auto-generated method stub

//                test1();
               
                Vector<Date> v1=new Vector<Date>();
                Method applyMethod=MapGenericDemo.class.getMethod("applyVector", v1.getClass());
                Type [] types=applyMethod.getGenericParameterTypes();
                ParameterizedType pType=(ParameterizedType) types[0];
                System.out.println(pType.getRawType());//打印出来的是原始的类型
                System.out.println(pType.public static void main(String[] args) throws SecurityException, NoSuchMethodException {
                // TODO Auto-generated method stub

//                test1();
               
                Vector<Date> v1=new Vector<Date>();
                Method applyMethod=MapGenericDemo.class.getMethod("applyVector", v1.getClass());
                Type [] types=applyMethod.getGenericParameterTypes();
                ParameterizedType pType=(ParameterizedType) types[0];
                System.out.println(pType.getRawType());//打印出来的是原始的类型
                System.out.println(pType.getActualTypeArguments()[0]);//打印出来的是实际参数类型
               
        }
        public static void applyVector(Vector<Date> v1) {
        }
        [0]);//打印出来的是实际参数类型
               
        }
        public static void applyVector(Vector<Date> v1) {
        }


这个代码是通过反射来获取了泛型的实际参数的类型,但是大家都知道,在java中泛型就仅仅只是用在编译时期的一个方式,在运行时期就直接把泛型给擦除了,我理解的就是,即使我能够在定义一个方法,这个方法传入的参数有这个泛型,它也是用作在编译时期,增加安全性,在事后编译成class文件之后就不存在了,那我们为什么还能拿到通过getActualTypeArguments()拿到参数类型呢,没懂……这些代码是死记下来的,其实还没有明白代码的意思。



作者: 2424308    时间: 2014-2-12 19:36
拿到的是类或者方法上定义的泛型
作者: LuckyQS    时间: 2014-2-13 10:34
//通过反射获取到成员方法
Method applyMethod=MapGenericDemo.class.getMethod("applyVector", v1.getClass());
/*applyMethod.getGenericParameterTypes();是说按照声明顺序返回 Type 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型的。如果底层方法不带参数,则返回长度为 0 的数组。如果形参类型是参数化类型,则为其返回的 Type 对象必须实际反映源代码中使用的实际类型参数。*/
Type [] types=applyMethod.getGenericParameterTypes();
//ParameterizedType 表示参数化类型,将type[0]强制转换成这种类型
  ParameterizedType pType=(ParameterizedType) types[0];
//ParameterizedType有getRawType()方法,返回 Type 对象,表示声明此类型的类或接口。
System.out.println(pType.getRawType());//打印出来的是原始的类型
//ParameterizedType有getActualTypeArguments()方法,返回表示此类型实际类型参数的 Type 对象的数组。
System.out.println(pType.getActualTypeArguments()[0]);//打印出来的是实际参数类型
public static void applyVector(Vector<Date> v1) {

}
我帮你的代码都加了中文注释,希望你能看懂
作者: 毛羚杨    时间: 2014-2-13 12:15
LuckyQS 发表于 2014-2-13 10:34
//通过反射获取到成员方法
Method applyMethod=MapGenericDemo.class.getMethod("applyVector", v1.getCl ...

谢谢 我尽量看去看懂




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2