Java中如何获取一个类中泛型的实际类型
Java获取泛型T的类型 T.class
Java如何优雅获取泛型类型
1.学习之前我们先来了解一些泛型的术语
<>: 念做typeof
List<E>: E称为类型参数变量
ArrayList<Integer>: Integer称为实际类型参数
ArrayList<Integer>: 整个ArrayList<Integer>称为参数化类型(对应着java.lang.reflect.ParameterizedType接口)
2.泛型反射相关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<C>,并且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()就可以了。
讲解完毕,如有错漏请多多包含!!!!!
Java中如何获取一个类中泛型的实际类型的更多相关文章
- 【Java基础】Java中如何获取一个类中泛型的实际类型
泛型的术语 <>: 念做typeof List<E>: E称为类型参数变量 ArrayList<Integer>: Integer称为实际类型参数 ArrayLis ...
- Java使用PropertyDescriptor获取实体类中私有属性的值,并给私有属性赋值
大家都知道Java类中的私有的(private)属性是获取不到的(即使使用继承依然获取不到),那如果非要获取私有属性的值怎么办呢?一般的做法是将该java类封装称为一个JavaBean,即封装该私有属 ...
- CI框架中一个类中调用另一个类中已经加载对象测试
controller.php <?php class CI_Controller { private static $instance; public function __construct( ...
- Runtime获取一个类中所有成员变量的名字和类型
- C# 中反射获取某类的子类和根据类型名动态创建对象
有时候,为了快速批量处理已经实现某个基类或者某个接口的子类,需要通过反射的方式获取到他们的类类型(Type),然后再通过 1 Activator.CreateInstance(objType); 或者 ...
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一. 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...
- Java反射机制demo(五)—获得并调用一个类中的方法
Java反射机制demo(五)—获得并调用一个类中的方法 这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和 ...
- Java中是否可以调用一个类中的main方法?
前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...
- Java中直接输出一个类的对象
例如 package com.atguigu.java.fanshe; public class Person { String name; private int age; public Strin ...
随机推荐
- Android 实现系统分享
使用手机上的程序,来分享/发送,比如QQ的“发送到我的电脑”. 1.分享/发送文本内容 Intent shareIntent = new Intent(); shareIntent.setAction ...
- Linux磁盘信息查询及删除文件操作
查询磁盘容量 $df -hl 删除文件固定行数 (1)删除第一行 $sed -i '1d' a.txt (2)删除指定行数 $sed -i '1,100d' a.txt 删除末尾行 $sed -i ' ...
- [TCP/IP] TCP如何实现流量控制和拥塞控制
流量控制:数据的传送与接收过程当中很可能出现收方来不及接收的情况,这时就需要对发方进行控制,以免数据丢失.流量控制用于防止在端口阻塞的情况下丢帧,这种方法是当发送或接收缓冲区开始溢出时通过将阻塞信号发 ...
- [TCP/IP] TCP报文长度是由什么确定的
MTU:最大传输单元,以太网的MTU为1500Bytes MSS:最大分解大小,为每次TCP数据包每次传输的最大数据的分段大小,由发送端通知接收端,发送大于MTU就会被分片 TCP最小数据长度为146 ...
- 3-10 Pandas 常用操作
1.构造数据 In [1]: import pandas as pd data=pd.DataFrame({'group':['a','a','a','b','b','b','c','c','c' ...
- FCOS及其和Faster R-CNN的区别
RetinaNet,SSD,YOLOv3,Faster R-CNN等都是Anchor-based的检测器,即需要预定义的Anchor boxes来进行训练.FCOS是一种Anchor-free和Pro ...
- [原创]Appium与Appium desktop的区别
1.两者都属于Appium 服务端 2.二者最新版本如下:地址:https://github.com/appium/appium-desktop/releases Appium 服务端支持的:地址:h ...
- 最易用的 Android HTTP library
原文:http://dukeland.hk/2012/08/02/the-simplest-android-http-library/ 這次要介紹的是這個來自 James Smith 的 Androi ...
- hbase配置hdfs的HA之后需要修改的路径
hbase-site.xml中配置了hdfs的一个路径 <property> <name>hbase.rootdir</name> <value>hdf ...
- 01-numpy-笔记-empty
import numpy as np >>> a = np.empty([2,3]) >>> a array([[0.00000000e+000, 4.935933 ...