本文转载用于个人学习,原文链接:http://www.blogjava.net/calvin/archive/2006/04/28/43830.html

今天在做通用的DAO时,遇到需要获取 实体类的Class对象 的问题,本来是使用泛型来设计的,但是泛型没有 T.class 的方法,原因是由于Java的泛型实现使用了“擦拭法”(具体怎么样的,还没有仔细去看过),导致Java的泛型不能直接获取到自身的声明的泛型类型。所以,在谷歌一番后,找到了这篇文章。

Java 5的泛型语法已经有太多书讲了,这里不再打字贴书。GP一定有用,不然Java和C#不会约好了似的同时开始支持GP。但大家也清楚,GP和Ruby式的动态OO语言属于不同的意识形态,如果是一人一票,我想大部分的平民程序员更热衷动态OO语言的平白自然。但如果不准备跳槽到支持JSR223的动态语言,那还是看看GP吧。

胡乱总结泛型的四点作用:
   第一是泛化,可以拿个T代表任意类型。 但GP是被C++严苛的静态性逼出来的,落到Java、C#这样的花语平原里----所有对象除几个原始类型外都派生于Object,再加上Java的反射功能,Java的Collection库没有范型一样过得好好的。

第二是泛型 + 反射,原本因为Java的泛型拿不到T.class而觉得泛型没用,最近才刚刚学到通过反射的API来获取T的Class,后述。

第三是收敛,就是增加了类型安全,减少了强制类型转换的代码。这点倒是Java Collection历来的弱项。

第四是可以在编译期搞很多东西,比如MetaProgramming。但除非能完全封闭于框架内部,框架的使用者和扩展者都不用学习这些东西的用法,否则那就是自绝于人民的票房毒药。C++的MetaProgramming好厉害吧,但对比一下Python拿Meta Programming生造一个Class出来的简便语法,就明白什么才是真正的叫好又叫座。

所以,作为一个架构设计师,应该使用上述的第2,3项用法,在框架类里配合使用反射和泛型,使得框架的能力更强; 同时采用收敛特性,本着对人民负责的精神,用泛型使框架更加类型安全,更少强制类型转换。
   
   擦拭法避免了Java的流血分裂 :
    大家经常骂Java GP的擦拭法实现,但我觉得多亏于它的中庸特性---如果你用就是范型,不用就是普通Object,避免了Java阵营又要经历一场to be or not to be的分裂。 
    最大的例子莫过Java 5的Collection 框架, 比如有些同学坚持认为自己不会白痴到类型出错,而且难以忍受每个定义的地方都要带一个泛型定义List〈Book〉,不用强制类型转换所省下的代码还不够N处定义花的(对了,java里面还没有tyepdef.....),因此对范型十分不感冒,这时就要齐齐感谢这个搽拭法让你依然可以对一个泛型框架保持非泛型的用法了...

 通过反射获得 T.class:
    
    不知为何书上不怎么讲这个,是差沙告诉我才知道的,最经典的应用见Hibernate wiki的Generic Data Access Objects, 代码如下:

 1 abstract public class BaseHibernateEntityDao<T> extends HibernateDaoSupport {
 2  private Class<T> entityClass;
 3  public BaseHibernateEntityDao() {
 4         entityClass =(Class<T>) ((ParameterizedType) getClass()
 5                                 .getGenericSuperclass()).getActualTypeArguments()[0];
 6     }
 7  public T get(Serializable id) {
 8         T o = (T) getHibernateTemplate().get(entityClass, id);
 9 }
10 }

精华就是这句了:

1 Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

泛型之后,所有BaseHibernateEntityDao的子类只要定义了泛型,就无需再重载getEnttityClass(),get()函数和find()函数,销益挺明显的,所以SpringSide的Dao基类毫不犹豫就泛型了。

不过擦拭法的大棒仍在,所以子类的泛型语法可不能乱写,最正确的用法只有:

1 public class BookDao extends BaseHibernateEntityDao<Book>

转载于:https://www.cnblogs.com/evilgod528/archive/2012/07/23/2604305.html

[转]Java5泛型的用法,T.class的获取和为擦拭法站台相关推荐

  1. Java5泛型的用法,T.class的获取和为擦拭法站台

    转载自  Java5泛型的用法,T.class的获取和为擦拭法站台 Java 5的泛型语法已经有太多书讲了,这里不再打字贴书.GP一定有用,不然Java和C#不会约好了似的同时开始支持GP.但大家也清 ...

  2. Java 泛型实现方法 — 擦拭法

    所谓擦拭法是指,虚拟机对泛型其实一无所知,所有的工作都是编译器做的. 例如,我们编写了一个泛型类Pair,这是编译器看到的代码: public class Pair<T> {private ...

  3. java反射获取泛型_如何通过Java反射获取泛型类型信息

    前言 关于Java泛型,很多人都有一个误解,认为Java代码在编译时会擦除泛型的类型,从而在运行时导致没法访问其类型,这其实并不完全正确,因为有一部分泛型信息是可以在运行时动态获取的,这部分信息基本能 ...

  4. 泛型相关用法(day3)

    一.instanceof 用法总结. instanceof属于java关键字之一,instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为:boolean ...

  5. Java语言学习之泛型的用法

    what does class<?> mean Created by Wang, Jerry on Jul 21, 2016 http://stackoverflow.com/questi ...

  6. 关于ts的一些泛型关键字用法

    partical 变成可选属性 partical< Usr> required 变成必选属性 required pick 选取部分属性 omit<Uer, "height& ...

  7. redisCommand接口的用法--利用hiredis库获取MGET命令的结果的坑!

    工作中遇到如下业务场景: 我需要利用大批量的key去借助MGET命令来获取redis服务器上的记录,但是我却始终获取不到.当然我可以使用GET去一条一条地获取,但是这样一来,效率不高.所以最好的方式是 ...

  8. java 泛型反射_Java使用反射来获取泛型信息示例

    本文实例讲述了Java使用反射来获取泛型信息.分享给大家供大家参考,具体如下: 一 点睛 获得了Field对象后,就可以很容易地获得该Field的数据类型,即使用如下代码即可获得指定Field的类型: ...

  9. jquery中cookie用法实例详解(获取,存储,删除等)

    这篇文章主要介绍了jquery中cookie用法,结合实例详细分析了jQuery操作cookie的获取,存储,删除等操作,并附带了Jquery操作Cookie记录用户查询过信息实现方法,需要的朋友可以 ...

最新文章

  1. 阻塞队列BlockingQueue 学习
  2. 组织可以最大限度提高数据中心性能的五个步骤
  3. cocos2d-x-3.x 动作(5)序列动作
  4. fe文件服务器,FE File Explorer
  5. FreeModbus保持寄存器
  6. mysql的service name_安装MYSQL出错:a windows service with the name MYSQL already...service解决...
  7. jQuery1.2选择器(1)
  8. 如何在 Mac 上的“磁盘工具”中使用密码加密和保护储存设备?
  9. net core引用外部dll发布后报错找不到文件
  10. excel删除行闪退_Excel出现闪退如何处理?
  11. JAVA 二维码图片生成和base64位加密解密
  12. 再读红宝书(第四版)第二章 html 中的 javascript
  13. win10 FTP搭建全过程
  14. 抖音被“逼”出个“视频朋友圈”
  15. Ray Dalio:经济机器是怎样运行的 (时长30分钟) 薛兆丰经济学讲义
  16. 判断字符串是否对称 C语言,c语言 判断字符串是否中心对称
  17. 阿里云服务器(Windows)如何用苹果手机远程连接?
  18. Python爬虫之网页采集器
  19. 基于Python+django的航班查询与推荐-计算机毕业设计
  20. MFC——CPropertySheet(属性表单)和CPropertyPage(属性页)——实现分页显示

热门文章

  1. leetcode —— 面试题68 - I. 二叉搜索树的最近公共祖先
  2. 傅里叶变换对噪声进行频谱分析
  3. KD_Tree 算法
  4. 设计模式学习笔记——桥接(Bridge)模式
  5. java定义int函数_Java自定义函数的四种类型
  6. linux mpeg4ip 编译,CentOS6.2下编译mpeg4ip
  7. oracle的索引使用方法,在OracleE数据库的字段上建立索引的方法
  8. java 保存图片_java实现保存文件图片以及读取
  9. sql语句分组mysql_以数据库字段分组显示数据的sql语句(详细介绍)
  10. python比较列表所有字符串_python – 将字符串与数组中的所有值进行比较