getSuperclass和getGenericSuperclass区别(java泛型和反射综合应用)

1.官方API对这两个方法的介绍 .

  • getSuperclass :
    返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。如果此 Class 表示 Object 类、一个接口、一个基本类型或 void,则返回 null。如果此对象表示一个数组类,则返回表示该 Object 类的 Class 对象。
  • getGenericSuperclass :
    返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的Type。如果超类是参数化类型,则返回的 Type 对象必须准确反映源代码中所使用的实际类型参数。如果以前未曾创建表示超类的参数化类型,则创建这个类型。有关参数化类型创建过程的语义,请参阅 ParameterizedType 声明。如果此 Class 表示 Object 类、接口、基本类型或 void,则返回 null。如果此对象表示一个数组类,则返回表示 Object 类的 Class 对象。

2.二者异同点

两个方法都是获取超类的类型 .
看一个例子 :
这里写图片描述

getSuperclass和getGenericSuperclass区别(java泛型和反射综合应用)_第1张图片
打印结果 :
这里写图片描述

这两者都能获取父类的类型 .

但是如果我们换成下面形式, 我们就可以找到两个方法差别 .
这里写图片描述

getSuperclass和getGenericSuperclass区别(java泛型和反射综合应用)_第2张图片

上面的方法, 我们使用”getGenericSuperclass()”方法获取父类的类型, 然后重新读一遍该方法的说明 “如果超类是参数化类型,则返回的 Type 对象必须准确反映源代码中所使用的实际类型参数 ” . 也就是这种方式可以获取超类的参数类型, 也就是泛型中的”Integer”类型 .
但是如果上面方法我们使用”getSuperclass() “方法就会出现类型转换错误”java.lang.Class cannot be cast to java.lang.reflect.
ParameterizedType”,


3. 实际应用.

记得以前使用hibernate时候, 我们会为所有Dao创建一个BaseDao, 将一般的增删改查操作抽取到BaseDao中 .
下面就是一个例子 :
这里写图片描述

getSuperclass和getGenericSuperclass区别(java泛型和反射综合应用)_第3张图片
我们将增删改查一般操作放在BaseDao中, 但是在”查”过程中, 遇到问题 . 当使用Hibernate拼写HQL时候, 查一张表需要知道这张表对应的对象的名称 . 比如”t_user”对应”User” . 那么在HQL中需要使用”User” . 但是在父类BaseDao中如何获取子类操作什么类型对象(UserDao操作User, DepartmentDao操作Department),
上面构造方法中, 就是获取的方式, 重点是利用泛型然后使用反射里的”getGenericSuperclass”方法, 就可以获取到对应的类型 . 进而获取对应的className .

你可能感兴趣的:(java基础)