【Java基础】Java中如何获取一个类中泛型的实际类型
泛型的术语
<>
: 念做typeof
List<E>
: E称为类型参数变量
ArrayList<Integer>
: Integer称为实际类型参数
ArrayList<Integer>
: 整个ArrayList<Integer>
称为参数化类型(对应着java.lang.reflect.ParameterizedType
接口)
泛型反射相关API
Type[] getGenericInterfaces():
获得当前类实现的泛型接口(参数化类型)
举例1:
1)定义类A,C 接口B
//类B
public interface B{}
//类C
public class C{}
//A实现B,向B传入实际类型参数C
public class A implements B<C>{}
2)测试代码
A a = new A();
Type[] types = a.getClass().getGenericInterfaces();
for (Type type : types) {
System.out.println(type);//结果是:B<C>
}
Type[] getGenericSuperclass()
:获得带有泛型的父类
举例2:
1)定义3个类A,B,C
//类B
public class B{}
//类C
public class C{}
//A继承B,向B传入实际类型参数C
public class A extends B<C>{}
2)测试代码
A a = new A();
Type type = a.getClass().getGenericSuperclass();
System.out.println(type);//结果是:B<C>
ParameterizedType
:参数化类型接口,Type的子接口
通过上面两个案例可知getGenericInterfaces和getGenericSuperclass可以获取到参数化类型B,并且ParameterizedType是Type的子接口,将Type强转成ParameterizedType。ParameterizedType提供了一个getActualTypeArguments()方法,这个方法可以获取参数化类型中的实际类型参数。
举例3:我们对案例2测试代码进行修改
A a = new A();
//获得带有泛型的父类
Type type = a.getClass().getGenericSuperclass();
System.out.println(type);//结果是:B<C>
//将type强转成Parameterized
ParameterizedType pt = (ParameterizedType )type;
/*得到父类(参数化类型)中的泛型(实际类型参数)的实际类型。
getActualTypeArguments()返回一个Type数组,之所以返回Type数组,是因为一个类上有可能出现多个泛型,比如:Map<Integer,String>
*/
Type [] actualTypes = pt.getActualTypeArguments();
System.out.println(actualTypes[0]);//结果:C
获取接口泛型的实际类型参数做法跟上面代码差不多,只需要把
Type type = a.getClass().getGenericSuperclass(),改成 Type type = a.getClass().getGenericInterfaces()就可以了。
public BasicAction(){
try {
//获取子类字节码文件对象,this代表的是子类对象。
Class clazz = this.getClass();
//获取子类所属接口的参数化类型,cn.xxx.xxx.BasicAction<cn.xxx.xxx.Standard>
Type type = clazz.getGenericSuperclass();
//因为type是顶级接口没有定义任何方法,所以需要强转为子接口ParameterizedType
ParameterizedType parameterizedType = (ParameterizedType) type;
//通过子接口定义的getActualTypeArguments方法获取到实际参数类型,<cn.xxx.xxx.Standard>
//返回参数为数组,因为Java中接口可以多实现
Type[] types = parameterizedType.getActualTypeArguments();
//获取数组中的实际参数类型
Class clzz = (Class) types[0];
//通过实际参数类型获取实际参数类型的实例
model = (T) clzz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
【Java基础】Java中如何获取一个类中泛型的实际类型的更多相关文章
- Java中如何获取一个类中泛型的实际类型
本文链接:https://blog.csdn.net/kuuumo/article/details/83021158 _______________________________________ ...
- 四、java基础-面向过程_对象_类中可出现的因素
1.面向过程和面向对象区别: 1)面向过程:开发一个应用程序.一个项目,必须先了解整个过程,了解各个步骤.模块间的因果关系,使的面向过程方式去开发程序时,代码和代码之间的关联程度是非常强.所以其中任何 ...
- CI框架中一个类中调用另一个类中已经加载对象测试
controller.php <?php class CI_Controller { private static $instance; public function __construct( ...
- Runtime获取一个类中所有成员变量的名字和类型
- C# 中反射获取某类的子类和根据类型名动态创建对象
有时候,为了快速批量处理已经实现某个基类或者某个接口的子类,需要通过反射的方式获取到他们的类类型(Type),然后再通过 1 Activator.CreateInstance(objType); 或者 ...
- 获取一个字符串中每一个字母出现的次数使用map集合
package 获取字符串中单字符出现次数; import java.util.Scanner; import java.util.TreeMap; /* * 需求:获取一个字符串中每一个字母出现的次 ...
- java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(2)
当我们知道一个类的对象,或者知道一个类的路径,或者指导这个类的名称的时候我们可以获取到这个类的类对象 当我们仅仅知道一个类的类对象的时候我们依然无法操作这个类,因为我们不知道这个类的属性,类的方法.那 ...
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一. 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...
- Java反射机制demo(五)—获得并调用一个类中的方法
Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...
随机推荐
- Android ANR从原理到日志分析,记下来就够了
站在巨人的肩膀上可以看的更远 做一个优秀的搬运工 Android 彻底理解安卓应用无响应机制 Android ANR日志分析全面解析 优秀的文章不可独享,要扩散,要做好笔记,哈 <沁园春长沙&g ...
- 第二周PTA笔记 均等笔+旋转骰子+两个日期相差天数
均等笔 n个人围成一圈,每人有ai支笔.每人可以向左右相邻的人传递笔,每人每次传递一支笔消耗的能量为1.求使所有人获得均等数量的笔的最小能量. 输入格式: 第一行一个整数n ,表示人的个数(30%的数 ...
- Effective C++ 总结笔记(六)
七.模板与泛型编程 41.了解隐式接口和编译器多态 1.类和模板都支持接口和多态. 2.类的接口是显式定义的--函数签名.多态是通过虚函数在运行期体现的. 3.模板的接口是隐式的(由模板函数的实现代码 ...
- Linux驱动实践:你知道【字符设备驱动程序】的两种写法吗?
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- 看动画学算法之:hashtable
目录 简介 散列表的关键概念 数组和散列表 数组的问题 hash的问题 线性探测 二次探测 双倍散列 分离链接 rehash 简介 java中和hash相关并且常用的有两个类hashTable和has ...
- [atARC121F]Logical Operations on Tree
(特判$n=1$的情况) 当确定权值和操作后,如何判定是否合法-- 考虑一个度为1的节点,对其权值即其对应边的边操作分类讨论: $1\or$,显然只需要最后选择这条边即可,一定合法 $1\and$或$ ...
- [bzoj4553]序列
记第i个位置有三个属性:1.ai表示原来的值:2.bi表示变成最大的值:3.ci表示变成最小的值.那么对于如果i在j的前面,那么必然有:$ai\le cj$且$bi\le aj$,那么令f[i]表示以 ...
- 数字逻辑实践3->EDA技术与Verilog设计
本文属于EDA技术概述类文章 1 EDA技术及其发展 概念 EDA(Electronic Design Automation),指的是以计算机为工作平台,以EDA软件工具为开发环境,以PLD期间或者A ...
- Java设计模式之(十一)——享元模式
1.什么是享元模式? Use sharing to support large numbers of fine-grained objects efficiently. 享元模式(Flyweight ...
- [FJOI2021]游记
高一这条命早在\(NOIP\)就没了,现在不过是强行续命罢了,希望死的不要很难看. 高二重开一档,最后一条命了,希望能高二进队\(Orz\). \(Day -2\) 开始敲板子. 先写了个交互的题,猜 ...