`
littie1987
  • 浏览: 130582 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

泛型Dao

阅读更多

在Sping和hibernate的整合当中,经常用到泛型DAO。泛型DAO涉及到一个问题,就是泛型父类怎么得到实际的实体类型的.class。

  在网上找到一个代码,可以借鉴一下:

    this.entityClass = null;
        Class c = this.getClass();
        Type t = c.getGenericSuperclass();
        if (t instanceof ParameterizedType) {
            Type[] p = ((ParameterizedType) t).getActualTypeArguments();

            this.entityClass = (Class<T>) p[0];
        }

 this.getClass,将会返回实例化子类的Class对象。有人和奇怪,为什会他会返回子类的实例。我的理解是,this在java中始终代表该类的实例化对象的引用,而我们一般是先创建一个具体的子类去继承泛型超类,而且也是实例化子类,所以this自然就代表了子类的引用。所以this.getClass()返回的自然就是子类的Class对象了。

      而c.getGenericSuperclass();用来返回表示当前Class 所表示的实体(类、接口、基本类型或 void)的直接超类的Type。如果超类是泛型的,那么他同时会返回泛型参数类型。

   t instanceof ParameterizedType意思是判断t是不是支持泛型,如果t实现了ParameterizedType接口,表示支持泛型。JDK1.4和以前的版本就不支持泛型。

     如果支持泛型,((ParameterizedType) t).getActualTypeArguments();将返回泛型参数的类型。也就是我们声明的T的类型。之所以为数组,就是因为我们可以为一个类指定多个泛型参数的约束。进行强制转换之后就可以得到泛型参数对应的Class。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics