ParameterizedType获取java泛型参数类型

ParameterizedType获取java泛型参数类型这两天在看以前写的 ssh 项目时 遇到一个问题就是封装的 BaseDaoImpl 抽象类 构造方法里面是这样写的 Class lt T gt clazz publicBaseDa Parameterize Parameterize getClass getGenericSu c

这两天在看以前写的ssh项目时,遇到一个问题就是封装的BaseDaoImpl抽象类,构造方法里面是这样写的

 Class 
  
    clazz; 
   public 
   BaseDaoImpl(){ ParameterizedType pt = (ParameterizedType)getClass().getGenericSuperclass(); clazz = (Class 
   
     )pt.getActualTypeArguments()[ 
    0]; } 
    
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

当时看到还真不知道里面到底是什么意思,记得以前写时是参考网上写的 ,于是我只有再去网上找答案了,一番搜索终于知道了。

ParameterizedType

  • getClass().getGenericSuperclass() 
    返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type,然后将其转换ParameterizedType。

  • getActualTypeArguments() 
    返回表示此类型实际类型参数的 Type 对象的数组。[0]就是这个数组中第一个了。简而言之就是获得超类的泛型参数的实际类型。

看意思可能不是很懂,我们直接看例子

package com.chen.demo; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; class param<T1, T2> { 
    class A { 
   } class B extends A { 
   } private Class 
  
    entityClass; public param (){ Type 
   type = getClass().getGenericSuperclass(); System.out.println( 
   "getClass() == " + getClass()); System.out.println( 
   "type = " + 
   type); Type trueType = ((ParameterizedType) 
   type).getActualTypeArguments()[ 
   0]; System.out.println( 
   "trueType1 = " + trueType); trueType = ((ParameterizedType) 
   type).getActualTypeArguments()[ 
   1]; System.out.println( 
   "trueType2 = " + trueType); 
   this.entityClass = (Class 
   
     )trueType; System.out.println( 
    "entityClass = " + entityClass); B t = 
    new B(); 
    type = t.getClass().getGenericSuperclass(); System.out.println( 
    "B is A's super class :" + ((ParameterizedType) 
    type).getActualTypeArguments().length); } } public 
    class ClassDemo extends param<MyClass, MyInvoke>{ 
      public static void main(String[] args) { ClassDemo classDemo = 
    new ClassDemo(); } } 
    package com.chen.demo; public 
    class MyClass { 
      } 
    package com.chen.demo; public 
    class MyInvoke { 
      } 
    
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

我们再看打印结果

getClass() == class com.chen.demo.ClassDemo type = com.chen.demo.param 
  
    trueType1 = 
   class com.chen.demo.MyClass trueType2 = 
   class com.chen.demo.MyInvoke entityClass = 
   class com.chen.demo.MyInvoke B is A 
   's super class :0 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

从上面结果我们可以总结如下,通过ParameterizedType获取泛型参数Class类型,然后我们就可以通过Class干一系列事情了。。。。。

比如数据库基本CRUD的工具类,直接看工具代码如下:

 public abstract class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> { 
    Class 
  
    clazz; 
   public BaseDaoImpl(){ 
   //getClass().getGenericSuperclass()返回表示此 Class  
   //所表示的实体(类、接口、基本类型或 void)的直接超类的 Type 
   //然后将其转换ParameterizedType 
   //getActualTypeArguments()返回表示此类型实际类型参数的 Type 对象的数组 
   //[0]就是这个数组中第一个了。 ParameterizedType pt = (ParameterizedType)getClass().getGenericSuperclass(); clazz = (Class 
   
     )pt.getActualTypeArguments()[ 
    0]; } @Override 
    public 
    void save(T entity) { getHibernateTemplate().save(entity); } @Override 
    public 
    void delete(Serializable id) { getHibernateTemplate().delete(findObjectById(id)); } @Override 
    public 
    void update(T entity) { getHibernateTemplate().update(entity); } @Override 
    public T findObjectById(Serializable id) { 
    return getHibernateTemplate().get(clazz, id); } @Override 
    public List 
    
      findObjects() { Query query = (Query) getSession().createQuery( 
     "from " + clazz.getSimpleName()); 
     return query.list(); } @Override 
     public List 
     
       findObjects(QueryHelper queryHelper){ Query listQuery = getSession().createQuery(queryHelper.getHql()); List 
       parameters = queryHelper.getParameters(); if(parameters != null){ for( int i = 0; i 
       
         return listQuery.list(); } 
         
      
     
    
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

工具类用到了Spring的orm模块,其次我们最重用的就是可以通过ParameterizedType封装通用的CRUD工具类,在实际的项目中,我们让不同的业务模块继承至该工具类,然后就可以直接使用其CRUD方法了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228213.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午7:33
下一篇 2026年3月16日 下午7:33


相关推荐

  • 用idea配置c3p0连接池「建议收藏」

    用idea配置c3p0连接池「建议收藏」文章目录前言1.准备2.c3p0连接池配置添加依赖创建c3p0-config.xml3.JDBC连接4.测试5.小结前言上次利用c3p0封装了数据库操作工具类,但没有用到连接池,在处理大数据量访问的时候那种方法事不好的,最好使用连接池,本文将配置连接池的源码贴出。1.准备下载的包均是此时最新包c3p0-0.9.5.2包的下载JDBC-Connector8.0驱动包下载…

    2022年6月9日
    224
  • c程序设计,贪吃蛇程序是什么_C语言编写贪吃蛇

    c程序设计,贪吃蛇程序是什么_C语言编写贪吃蛇C语言,贪吃蛇程序设计一.代码分析(1)头文件(2)宏定义(3)全局变量(4)函数部分1)绘制地图函数DreawMap(),2)食物位置函数FoodRand()3)键盘控制移动函数ControlMove()函数4)移动函数Move()函数5)蛇身开始函数Isnake()函数6)判断食物是否被吃到函数Jfood()函数7)判断是否碰到墙Jwell()函数8)判断是否碰到蛇身Jsnake()函数9)计算分数和难度Showf()函数10)清空存储空间函数二.代码附录一.代码分析(1)头文件1.include

    2025年7月22日
    4
  • c++多态的案例分析

    c++多态的案例分析

    2021年12月15日
    46
  • openwrt释放ip_openwrt stdout

    openwrt释放ip_openwrt stdoutopenwrt清除ipsetip缓存ipsetflushgfwlist

    2022年10月7日
    8
  • ORA-00904: “NAME”: 标识符无效

    参考上面的https://blog.csdn.net/qq_21383435/article/details/94459706插入语句为selectid,namefromUSERS因为没有区分大小写,所以报错,改成大些就好了selectID,NAMEfromUSERS…

    2022年4月5日
    90
  • 操作系统内存管理(思维导图详解)

    操作系统内存管理(思维导图详解)1 计算机的存储体系内存是计算机很重要的一个资源 因为程序只有被加载到内存中才可以运行 此外 CPU 所需要的指令与数据也都是来自内存的 可以说 内存是影响计算机性能的一个很重要的因素 在介绍内存管理的细节前 先要了解一下分层存储器体系 大部分的计算机都有一个存储器层次结构 即少量的非常快速 昂贵 易变的高速缓存 cache 若干兆字节的中等速度 中等价格 易变的主存储器 RAM

    2026年3月18日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号