【Type】类型 ParameterizedType
Type 接口【重要】
public interface java.lang.reflect.Type {
/**
* Returns a string describing this type, including information about any type parameters.
* @implSpec The default implementation calls {@code toString}.
* @return a string describing this type
* @since 1.8
*/
default String getTypeName() {
return toString();
}
}
Type接口的来历
Java中的所有类型
- raw type:原始类型,对应Class 。这里的Class不仅仅指平常所指的类,还包括数组、接口、注解、枚举等结构。
- primitive types:基本类型,仍然对应Class
- parameterized types:参数化类型,对应ParameterizedType,带有类型参数的类型,即常说的泛型,如:List<T>、Map<Integer, String>、List<? extends Number>。
- type variables:类型变量,对应TypeVariable<D>,如参数化类型中的E、K等类型变量,表示泛指任何类。
- array types:(泛型)数组类型,对应GenericArrayType,比如List<T>[],T[]这种。注意,这不是我们说的一般数组,而是表示一种【元素类型是参数化类型或者类型变量的】数组类型。
注意:WildcardType代表通配符表达式,或泛型表达式,比如【?】【? super T】【? extends T】。虽然WildcardType是Type的一个子接口,但并不是Java类型中的一种。
测试代码
public class Test {
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
Method method = Test.class.getMethod("testType", List.class, List.class, List.class, List.class, List.class, Map.class);
Type[] types = method.getGenericParameterTypes();//按照声明顺序返回 Type 对象的数组
for (Type type : types) {
ParameterizedType pType = (ParameterizedType) type;//最外层都是ParameterizedType
Type[] types2 = pType.getActualTypeArguments();//返回表示此类型【实际类型参数】的 Type 对象的数组
for (int i = 0; i < types2.length; i++) {
Type type2 = types2[i];
System.out.println(i + " 类型【" + type2 + "】\t类型接口【" + type2.getClass().getInterfaces()[0].getSimpleName() + "】");
}
}
}
public <T> void testType(List<String> a1, List<ArrayList<String>> a2, List<T> a3, //
List<? extends Number> a4, List<ArrayList<String>[]> a5, Map<String, Integer> a6) {
}
}
0 类型【class java.lang.String】 类型接口【Serializable】
0 类型【java.util.ArrayList<java.lang.String>】 类型接口【ParameterizedType】
0 类型【T】 类型接口【TypeVariable】
0 类型【? extends java.lang.Number】 类型接口【WildcardType】
0 类型【java.util.ArrayList<java.lang.String>[]】 类型接口【GenericArrayType】
0 类型【class java.lang.String】 类型接口【Serializable】
1 类型【class java.lang.Integer】 类型接口【Serializable】
Type 接口的四个子接口
ParameterizedType 泛型/参数化类型【重要】
public interface java.lang.reflect.ParameterizedType extends Type
ParameterizedType 表示参数化类型,带有类型参数的类型,即常说的泛型,如:List<T>、Map<Integer, String>、List<? extends Number>。
方法
- Type[] getActualTypeArguments() 返回表示此类型实际类型参数的 Type 对象的数组。【重要】
- 简单来说就是:获得参数化类型中<>里的类型参数的类型。
- 因为可能有多个类型参数,例如Map<K, V>,所以返回的是一个Type[]数组。
- 注意:无论<>中有几层<>嵌套,这个方法仅仅脱去最外层的<>,之后剩下的内容就作为这个方法的返回值,所以其返回值类型不一定。
- Type getOwnerType() 返回 Type 对象,表示此类型是其成员之一的类型。
- 如果此类型为顶层类型,则返回 null(大多数情况都是这样)。
- Type getRawType() 返回 Type 对象,表示声明此类型的类或接口。
- 简单来说就是:返回最外层<>前面那个类型,例如Map<K ,V>,返回的是Map类型。
public class Test {
public static void main(String[] args) throws Exception {
Method method = Test.class.getMethod("test", Map.Entry.class);
Type[] types = method.getGenericParameterTypes();
for (Type type : types) {
ParameterizedType pType = (ParameterizedType) type;
System.out.println(pType + " ★ " + pType.getOwnerType() + " ★ " + pType.getRawType() //
+ " ★ " + Arrays.toString(pType.getActualTypeArguments()));
//java.util.Map.java.util.Map$Entry<T, U> ★ interface java.util.Map ★ interface java.util.Map$Entry ★ [T, U]
}
}
public static <T, U> void test(Map.Entry<T, U> mapEntry) {
}
}
TypeVariable<D> 类型变量/泛指任何类【掌握】
public interface java.lang.reflect.TypeVariable<D extends GenericDeclaration> extends Type
类型变量,如参数化类型中的E、K等类型变量,表示泛指任何类。
方法
- Type[] getBounds() 返回表示此类型变量上边界的 Type 对象的数组。
- 返回:表示此类型变量的上边界的 Type 的数组
- 注意,如果未显式声明上边界,则上边界为 Object。
- D getGenericDeclaration() 返回 GenericDeclaration 对象,该对象表示声明此类型变量的一般声明。
- 返回:为此类型变量声明的一般声明。
- String getName() 返回此类型变量的名称,它出现在源代码中。
public static <T extends Person, U> void main(String[] args) throws Exception {
Method method = Test.class.getMethod("main", String[].class);
TypeVariable<?>[] tvs = method.getTypeParameters();//返回声明顺序的 TypeVariable 对象的数组
System.out.println("声明的类型变量有:" + Arrays.toString(tvs));//[T, U]
for (int i = 0; i < tvs.length; i++) {
GenericDeclaration gd = tvs[i].getGenericDeclaration();
System.out.println("【GenericDeclaration】" + gd);//public static void com.bqt.Test.main(java.lang.String[]) throws java.lang.Exception
System.out.println(gd.getTypeParameters()[i] == tvs[i]);//true。 GenericDeclaration和TypeVariable两者相互持有对方的引用
System.out.println(tvs[i] + " " + tvs[i].getName() + " " + Arrays.toString(tvs[i].getBounds()));//T T [class com.bqt.Person] 和 U U [class java.lang.Object]
}
}
GenericArrayType (泛型)数组类型
public interface java.lang.reflect.GenericArrayType extends Type
GenericArrayType 表示一种(泛型)数组类型,其组件类型为参数化类型或类型变量。
比如List<T>[],T[]这种。注意,这不是我们说的一般数组,而是表示一种【元素类型是参数化类型或者类型变量的】数组类型。
方法
- Type getGenericComponentType() 返回表示此数组的组件类型的 Type 对象。此方法创建数组的组件类型。
- 获取泛型数组中元素的类型,要注意的是:无论从左向右有几个[]并列,这个方法仅仅脱去最右边的[]之后剩下的内容就作为这个方法的返回值。
WildcardType 通配符(泛型)表达式
public interface java.lang.reflect.WildcardType extends Type
WildcardType代表通配符表达式,或泛型表达式,比如【?】【? super T】【? extends T】。虽然WildcardType是Type的一个子接口,但并不是Java类型中的一种。
方法
- Type[] getLowerBounds() 返回表示此类型变量下边界的 Type 对象的数组。注意,如果不存在显式声明的下边界,则下边界为类型 null。在此情况下,将返回长度为零的数组。
- Type[] getUpperBounds() 返回表示此类型变量上边界的 Type 对象的数组。注意,如果不存在显式声明的上边界,则上边界为 Object。
public interface java.lang.reflect.ParameterizedType extends Type
- Type[] getActualTypeArguments() 返回表示此类型实际类型参数的 Type 对象的数组。【重要】
- 简单来说就是:获得参数化类型中<>里的类型参数的类型。
- 因为可能有多个类型参数,例如Map<K, V>,所以返回的是一个Type[]数组。
- 注意:无论<>中有几层<>嵌套,这个方法仅仅脱去最外层的<>,之后剩下的内容就作为这个方法的返回值,所以其返回值类型不一定。
- Type getOwnerType() 返回 Type 对象,表示此类型是其成员之一的类型。
- 如果此类型为顶层类型,则返回 null(大多数情况都是这样)。
- Type getRawType() 返回 Type 对象,表示声明此类型的类或接口。
- 简单来说就是:返回最外层<>前面那个类型,例如Map<K ,V>,返回的是Map类型。
public class Test {
public static void main(String[] args) throws Exception {
Method method = Test.class.getMethod("test", Map.Entry.class);
Type[] types = method.getGenericParameterTypes();
for (Type type : types) {
ParameterizedType pType = (ParameterizedType) type;
System.out.println(pType + " ★ " + pType.getOwnerType() + " ★ " + pType.getRawType() //
+ " ★ " + Arrays.toString(pType.getActualTypeArguments()));
//java.util.Map.java.util.Map$Entry<T, U> ★ interface java.util.Map ★ interface java.util.Map$Entry ★ [T, U]
}
}
public static <T, U> void test(Map.Entry<T, U> mapEntry) {
}
}
public interface java.lang.reflect.TypeVariable<D extends GenericDeclaration> extends Type
- Type[] getBounds() 返回表示此类型变量上边界的 Type 对象的数组。
- 返回:表示此类型变量的上边界的 Type 的数组
- 注意,如果未显式声明上边界,则上边界为 Object。
- D getGenericDeclaration() 返回 GenericDeclaration 对象,该对象表示声明此类型变量的一般声明。
- 返回:为此类型变量声明的一般声明。
- String getName() 返回此类型变量的名称,它出现在源代码中。
public static <T extends Person, U> void main(String[] args) throws Exception {
Method method = Test.class.getMethod("main", String[].class);
TypeVariable<?>[] tvs = method.getTypeParameters();//返回声明顺序的 TypeVariable 对象的数组
System.out.println("声明的类型变量有:" + Arrays.toString(tvs));//[T, U]
for (int i = 0; i < tvs.length; i++) {
GenericDeclaration gd = tvs[i].getGenericDeclaration();
System.out.println("【GenericDeclaration】" + gd);//public static void com.bqt.Test.main(java.lang.String[]) throws java.lang.Exception
System.out.println(gd.getTypeParameters()[i] == tvs[i]);//true。 GenericDeclaration和TypeVariable两者相互持有对方的引用
System.out.println(tvs[i] + " " + tvs[i].getName() + " " + Arrays.toString(tvs[i].getBounds()));//T T [class com.bqt.Person] 和 U U [class java.lang.Object]
}
}
GenericArrayType (泛型)数组类型
public interface java.lang.reflect.GenericArrayType extends Type
- Type getGenericComponentType() 返回表示此数组的组件类型的 Type 对象。此方法创建数组的组件类型。
- 获取泛型数组中元素的类型,要注意的是:无论从左向右有几个[]并列,这个方法仅仅脱去最右边的[]之后剩下的内容就作为这个方法的返回值。
public interface java.lang.reflect.WildcardType extends Type
- Type[] getLowerBounds() 返回表示此类型变量下边界的 Type 对象的数组。注意,如果不存在显式声明的下边界,则下边界为类型 null。在此情况下,将返回长度为零的数组。
- Type[] getUpperBounds() 返回表示此类型变量上边界的 Type 对象的数组。注意,如果不存在显式声明的上边界,则上边界为 Object。
【Type】类型 ParameterizedType的更多相关文章
- 浩哥解析MyBatis源码(十)——Type类型模块之类型处理器
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...
- MyBatis源码解析(十)——Type类型模块之类型处理器TypeHandler
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...
- 基础篇:深入解析JAVA泛型和Type类型体系
目录 1 JAVA的Type类型体系 2 泛型的概念 3 泛型类和泛型方法的示例 4 类型擦除 5 参数化类型ParameterizedType 6 泛型的继承 7 泛型变量TypeVariable ...
- Input对象的type类型
Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍. 1,type=text 输入类型是text ...
- Type 类型
修改 type 类型 UPDATE wd_order2 SET info = array_append(info, row(2,100001, now() )::info ) WHERE id_ ...
- 使用Atlas进行元数据管理之Type(类型)
背景:笔者和团队的小伙伴近期在进行数据治理/元数据管理方向的探索, 在接下来的系列文章中, 会陆续与读者们进行分享在此过程中踩过的坑和收获. 元数据管理系列文章: [0] - 使用Atlas进行元数据 ...
- HTML(七)HTML 表单(form元素介绍,input元素的常用type类型,input元素的常用属性)
前言 表单是网页与用户的交互工具,由一个<form>元素作为容器构成,封装其他任何数量的表单控件,还有其他任何<body>元素里可用的标签 表单能够包含<input> ...
- Asterisk的type类型和身份认证
Asterisk的type类型和身份认证 转载:http://zeevli.blog.163.com/blog/static/119591610201111745012380/ 在Asterisk中对 ...
- Flume source 支持的type类型
Flume是一个分布式的高可用的消费组件.通过修改配置文件,可以启动不同的agent处理不同来源的数据. agent包含source,channel,sink三个组件.今天我们学习下source的ty ...
随机推荐
- MapReduce与批处理------《Designing Data-Intensive Applications》读书笔记14
之前的文章大量的内容在和大家探讨分布式存储,接下来的章节进入了分布式计算领域.坦白说,个人之前专业的重心侧重于存储,对许多计算的内容理解可能不是和确切,如果文章中的理解有所不妥,愿虚心赐教.本篇将和大 ...
- python3之Django内置模板标签和过滤器
一.模板标签 内置标签: 1.autoescape 控制当前的自动转义行为,此标记采用on或者off作为参数,并确定自动转义是否在块内有效.该块以endautoescape结束标签关闭. views: ...
- Java反射机制demo(七)—反射机制与工厂模式
Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...
- JAVAEE——BOS物流项目02:学习计划、动态添加选项卡、ztree、项目底层代码构建
1 学习计划 1.jQuery easyUI中动态添加选项卡 2.jquery ztree插件使用 n 下载ztree n 基于标准json数据构造ztree n 基于简单json数据构造ztree( ...
- BigDecimal 两种方式
第一种: Double a=0.06; Double b=0.01; BigDecimal addend = BigDecimal.valueOf(a); BigDecimal augend = Bi ...
- 选择 React Native 的理由
转载:选择 React Native 的理由 从开始知道 React Native 到现在已经过了5个月,真实的试用也经历了三个月的时间.阅读文档开始,了解是什么,到简单的理解为什么,都是在聆听不同的 ...
- 数据储存为base64编码,如何实现模糊搜索
假设字段title存储的是经过base64编码后的字符串,$key是存搜索关键字的变量 则普通的查询方法, select * from 表名 where title like '$key'; 无法正确 ...
- QT学习笔记6:常见的 QGraphicsItem
简述 QGraphicsItem 类是 QGraphicsScene 中所有 item 的基类. 它提供了一个轻量级的基础,用于编写自定义 item.其中包括:定义 item 的几何形状.碰撞检测.绘 ...
- BZOJ 1174 [Balkan2007]Toponyms(Trie)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1174 [题目大意] 选出一些字符串,使得字符串的最长公共前缀*字符串的总个数最大化 [ ...
- hdu 4417 区间内比h小的数 线段树
题意求区间内比h小的数的个数 将所有的询问离线读入之后,按H从小到大排序.然后对于所有的结点也按从小到大排序,然后根据查询的H,将比H小的点加入到线段树,然后就是一个区间和. 2015-07-27:专 ...