ParameterizedType及其方法详解
我们在项目的BaseDao这个类中经常要用到ParameterizedType这个接口。
先贴一段代码:
public class BaseDao<T> {// Dbutils中的查询类private QueryRunner queryRunner = new QueryRunner();// 用来接收子类的泛型的类型private Class<T> type;{// 子类对象被建立时,会调用父类的构造代码块// 这里的this指向了子类对象// 获取子类的Class对象Class clazz = this.getClass();// 获取带泛型的父类的ParameterizedType对象ParameterizedType superclass = (ParameterizedType) clazz.getGenericSuperclass();// 获取泛型参数数组Type[] actualTypeArguments = superclass.getActualTypeArguments();// 该数组的第一个值就是T(也就是子类的Class类型)type = (Class<T>) actualTypeArguments[0];}
首先让我们来了解一下Type这个接口。
Type是Java中所有类型的通用超级接口。 这些类型包括基本类型,参数化类型,数组类型,类型变量。
这里的类型其实是某个类的对应的Class名。
如:Integer.class, Double.class, Person.class
public class Main {public static void main(String[] args) {Field[] fields = Person.class.getDeclaredFields();for (Field field : fields) {if (field.getGenericType() instanceof ParameterizedType) {ParameterizedType genericType = (ParameterizedType) field.getGenericType();Type[] arguments = genericType.getActualTypeArguments();for (Type type : arguments) {System.out.println(type);}}}}
}class Person {List<Integer> integerList;List<Double> doubleList;List<Main> mainList;
}结果:java.lang.Integerjava.lang.DoubleMain
所以我们只要得到Type对象,就得到了泛型类。
再来看ParameterizedType 接口,它是Type接口的子接口,表示参数化类型。如:List< Integer >; 这个接口中有个方法getActualTypeArguments()它可以获取某个类的所有Type对象(即可以获取某个类的所有泛型)
举个例子:
父类Person的泛型有两个
public class Person<T, E> {}
我们怎样可以获取父类中的泛型呢?
public class Student extends Person<Student, Integer> {public static void main(String[] args) {Class clazz = Student.class;//获取带泛型的类型ParameterizedType superclass = (ParameterizedType) clazz.getGenericSuperclass();Type[] arguments = superclass.getActualTypeArguments();for (Type argument : arguments) {System.out.println(argument);}}}结果:StudentInteger
获取父类泛型的类型的方式总结:
1.构造子类Class对象
2.获取带泛型的父类的ParameterizedType对象
2.获取父类的Type数组(Type数组中保存了父类的泛型的类型)
ParameterizedType及其方法详解相关推荐
- python统计csv行数_对Python 多线程统计所有csv文件的行数方法详解
如下所示: #统计某文件夹下的所有csv文件的行数(多线程) import threading import csv import os class MyThreadLine(threading.Th ...
- python修改文件内容_Python批量修改文本文件内容的方法详解
这篇文章主要介绍了Python批量修改文本文件内容的方法的相关资料,需要的朋友可以参考下 Python批量替换文件内容,支持嵌套文件夹 import os path="./" fo ...
- python二维元组_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
如何去读取一个没有表头的二维csv文件(如下图所示)? 并以元组的形式表现数据: ((1.0, 0.0, 3.0, 180.0), (2.0, 0.0, 2.0, 180.0), (3.0, 0.0, ...
- Spring JdbcTemplate方法详解
2019独角兽企业重金招聘Python工程师标准>>> Spring JdbcTemplate方法详解 标签: springhsqldbjava存储数据库相关sql 2012-07- ...
- golang 解析php序列化,golang实现php里的serialize()和unserialize()序列和反序列方法详解...
Golang 实现 PHP里的 serialize() . unserialize() 安装 go get -u github.com/techleeone/gophp/serialize 用法 pa ...
- ES5和ES6数组遍历方法详解
ES5和ES6数组遍历方法详解 在ES5中常用的10种数组遍历方法: 1.原始的for循环语句 2.Array.prototype.forEach数组对象内置方法 3.Array.prototype. ...
- linux expect 输入密码,shell脚本无密码登录 expect的使用方法详解
shell脚本无密码登录 expect的使用方法详解 今天需要做一个定时任务脚本将最新的数据包文件传到远程的服务器上,虽然有密钥但也是要求输入密码的那种,所以只能另想办法实现让脚本自动输入密码了. 从 ...
- 饥荒怎么自动订阅服务器,饥荒联机版自动挂礼物mod及使用方法详解
饥荒联机版中官方经常会推出一些挂机掉落礼物的活动,可能一些玩家会觉得很麻烦,下面给大家分享一些自动挂礼物mod和其使用方法,希望可以帮助到各位玩家. 饥荒联机版自动挂礼物mod及使用方法详解 挂礼物m ...
- linux oracle 用户创建,LINUX下Oracle数据库用户创建方法详解
本文实例分析了LINUX下Oracle数据库用户创建方法.分享给大家供大家参考,具体如下: 1)登录linux,以oracle用户登录(如果是root用户登录的,登录后用 su - oracle命令切 ...
最新文章
- java native
- SEO -- 搜索引擎优化
- python3.6.0安装步骤
- [Leetcode][第647题][JAVA][回文子串][动态规划][中心扩展][Manacher 算法]
- LeetCode:225. 用队列实现栈
- 32岁程序员推拿一小时差点丧命!医生说按错这个地方
- final关键字多态
- 嵌入式学习文章推荐+资料下载
- 解决知网外文文献无法下载全文的问题
- X4扭曲字体或图形 coreldraw_CorelDRAWX4SP2简体中文正式版精简增强版
- ADO简介(未完成)
- unbound部署DNS
- configure: error: C++ preprocessor “/lib/cpp“ fails sanity check
- linux双系统启动引导,linux windows 双系统并存与启动引导
- pd.concat用法
- 一元函数微分学的几何与物理应用
- python表情库 emoji
- IFS系统功能清单之四——IFS 分销(Distribution)(续)
- screenshot python_python 截图screenshot处理
- 机器学习之Python使用KNN算法对鸢尾花进行分类
热门文章
- 《程序员修炼之道》读后感
- iTween基础之功能简介及插件下载
- css规则_控制CSS规则之战
- Mysql修改常用sql: 添加字段、修改字段、添加索引
- 手动选择显示_【新品推介】Comet CAA500 MK2天线分析仪 | 高精度模拟十字针同时显示SWR和阻抗...
- Xstart Insatll And Usage
- JS Vue 禁止输入框输入特殊符号或emoji表情
- LeetCode 每日一题——1684. 统计一致字符串的数目
- 恒源云(GPUSHARE)_人工智能行业 | AI+教育,虚实之间
- linux开机启动步骤