如何使用反射技术获取泛型类的真实类型

来源:互联网 发布:淘宝如何上架宝贝 编辑:程序博客网 时间:2024/05/16 16:59
平常我们需要获取某个类的类型,一般是直接使用 "实例.getClass()",获取 "类名 .class" 直接获取 。
例如: 假设此时有一个User类,那么要获取该User类的真实类型的话,可以直接使用类名+".class"获取: ”User.class“
或者,通过User类的实例 user.getClass() 来获取;
上面两个例子是已经确定该类的类型是User类型了,所以,才可以使用上面的方法。
而泛型类因为还不能确定是什么类型,所以没办法使用上面的两个方法(实例.getClass(),类名.class);
如果类是泛型的话,那么该如何获取呢?
我们可以通过获取该泛型类的子类的传入的类型参数来确定该泛型类的真实类型。
如:
有个类继承了一个泛型类,给该泛型类传入了一参数 "User" --->这个参数就是解决问题的关键点了
  1. public UserDao extends BaseDaoImpl<User>{
  2. .....
  3. }
该泛型类BaseDaoImpl<T>的代码如下:
  1. public BaseDaoImpl() {
  2. Class c = this.getClass();
  3. Type t = c.getGenericSuperclass();
  4. if (t instanceof ParameterizedType) {
  5. // System.out.println("in if");
  6. Type[] p = ((ParameterizedType) t).getActualTypeArguments();
  7. // System.out.println(Arrays.toString(p));
  8. this.clazz = (Class<T>) p[0];
  9. }
  10. }

BaseDaoImpl<T>的构造函数中的 this 指的是子类的实例。
this.getClass()获取子类的真实类型;
c.getGenericSuperclass(); 获取泛型父类
t.getActualTypeArguments(); 通过该泛型父类来获取真实的类型参数的数组;也就是获取泛型父类的尖括号里面的参数<T>,
因为泛型的尖括号是可以有多个参数的,所以该方法返回的是一个数组。
p[0](既:t.getActualTypeArguments()[0]); 获取该数组的第一个值。因为我们知道在该例子中BaseDaoImpl<T>只有一个参数T。所以我们只需要获取第一个值就可以了。

在这里需要注意的是:范式应该在编译的时候就指定,而不是运行时。
如果我把上面BaseDaoImpl(){  }改成如下这样子:
[错误示范]
  1. public BaseDaoImpl() {
  2. ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
  3. this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
  4. //输出结果,验证类型名称是否正确
  5. //System.out.println("clazz --> " + clazz.getSimpleName()); //getSimpleName()是返回不包含包名的类名称
  6. }
上面这段代码,因为在编译器进行编译的时候,还不能确定泛型的具体类型,所以会报如下的错误:
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
====================================================================
结束。

转载自:http://www.cnblogs.com/JamKong/p/4540142.html
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 涉黄刑事拘留怎么办取保候审 换了车牌保险怎么办 车辆转让后保险怎么办 立案后警察不管怎么办 打架后对方讹人怎么办 工商被恶意举报怎么办 店铺被工商举报怎么办 被买单侠恐吓怎么办? 团伙作案刑事拘留怎么办取保 欢乐麻将老输怎么办 回不了家怎么办身份证 没注意闯红灯了怎么办 摩托车被套牌了怎么办? 发现员工偷钱怎么办 盗窃刑事拘留7天怎么办 盗窃抓不到人怎么办 发现宿舍被盗后怎么办(  ) 发现宿舍被盗后怎么办() 回收到赃物电瓶怎么办 不知情买了赃物怎么办 盗窃单位要报警怎么办 上网吸烟被逮住怎么办 有人在微信骂我怎么办 网吧抽烟被拍照怎么办 诈骗被拘留该怎么办 行政拘留人跑了怎么办 车牌号被偷了怎么办 当员工提出辞职怎么办 老员工提出辞职怎么办 家人进看守所了怎么办 被贷款中介诈骗怎么办 喝完酒吐难受怎么办 犯罪嫌疑人死在看守所怎么办 犯罪嫌疑人死不承认怎么办 高血压进了看守所怎么办 看守所里被欺负怎么办 老师上课迟到了怎么办 艾滋病看守所不收怎么办 没能力偿还债务怎么办 监狱病人的癌症怎么办 监狱的传染病人怎么办