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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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()拿到参数类型呢,没懂……这些代码是死记下来的,其实还没有明白代码的意思。


评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

3 个回复

正序浏览
LuckyQS 发表于 2014-2-13 10:34
//通过反射获取到成员方法
Method applyMethod=MapGenericDemo.class.getMethod("applyVector", v1.getCl ...

谢谢 我尽量看去看懂
回复 使用道具 举报
//通过反射获取到成员方法
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) {

}
我帮你的代码都加了中文注释,希望你能看懂

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报 1 0
拿到的是类或者方法上定义的泛型
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马