简介

Type是Java 编程语言中所有类型的公共高级接口,和Object不同,Object是所有类的父类,即Object是Type的父类。

分类

原始类型(Class):不仅仅包含我们平常所指的类,还包括枚举、数组、注解等;

参数化类型(ParameterizedType):就是我们平常所用到的泛型List、Map;

数组类型(GenericArrayType):并不是我们工作中所使用的数组String[] 、byte[],而是带有泛型的数组,即T[] ;

基本类型(Class):也就是我们所说的java的基本类型,即int,float,double等。

详细分类

ParameterizedType

  • 含义:

    参数化类型,即泛型;例如:List、Map<K,V>等带有参数化的对象;
  • 代码:
   /**
*
* ParameterizedType表示参数化类型,也就是泛型,例如List<T>、Set<T>等;
**/
private List<T> list=null;
private List<T> set=null; @Test
public void test() throws NoSuchFieldException {
Field fieldList=ParameterizedTypeDemo.class.getDeclaredField("list");
Type typeList = fieldList.getGenericType();
//sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
System.out.println("获取的type类型 typeList-->"+typeList.getClass().getName());
Field fieldSet=ParameterizedTypeDemo.class.getDeclaredField("set");
Type typeSet = fieldSet.getGenericType();
//sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
System.out.println("获取的type类型 typeSet-->"+typeSet.getClass().getName());
} private Map<String,Integer> map=null; @Test
public void tset2() throws NoSuchFieldException {
Field declaredField = ParameterizedTypeDemo.class.getDeclaredField("map");
Type genericType = declaredField.getGenericType();
ParameterizedType parameterizedType=(ParameterizedType)genericType;
Type name1 = parameterizedType.getActualTypeArguments()[0];
//java.lang.String
System.out.println("ParameterizedType 获取参数1泛型类全名-->"+name1.getTypeName());
Type name2 = parameterizedType.getActualTypeArguments()[1];
//java.lang.Integer
System.out.println("ParameterizedType 获取参数2泛型类全名-->"+((Class)name2).getName());
Type rawType = parameterizedType.getRawType();
//interface java.util.Map
System.out.println("获取声明泛型的类或者接口---》"+rawType);
}

TypeVariable

  • 含义:

    类型变量,即泛型中的变量;例如:T、K、V等变量,可以表示任何类;在这需要强调的是,TypeVariable代表着泛型中的变量,而ParameterizedType则代表整个泛型;
  • 代码:
private List<T> list;

    /**
* 泛型的类型变量,指的是List<T>、Map<K,V>中的T,K,V等值,实际的Java类型是TypeVariableImpl
* (TypeVariable的子类);此外,还可以对类型变量加上extend限定,这样会有类型变量对应的上限;
*
**/
@Test
public void test() throws NoSuchFieldException {
Field list = TypeVariableDemo.class.getDeclaredField("list");
//获取该属性的实际类型
Type genericType = list.getGenericType();
ParameterizedType parameterizedType=(ParameterizedType)genericType;
//获取泛型中的实际类型
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
//sun.reflect.generics.reflectiveObjects.TypeVariableImpl
System.out.println("获取泛型中的实际类型-->"+actualTypeArguments[0].getClass().getName());
} @Test
public void test2() throws NoSuchFieldException {
new TypeVariableTwoDemo().test(); } public class TypeVariableTwoDemo<T extends Number & Serializable & Comparable,K>{ private T t;
private K k; public void test() throws NoSuchFieldException { Field field = TypeVariableTwoDemo.class.getDeclaredField("t");
Type genericType = field.getGenericType();
TypeVariable typeVariable=(TypeVariable)genericType;
Type[] bounds = typeVariable.getBounds();
//class java.lang.Number
//interface java.io.Serializable
//interface java.lang.Comparable
Arrays.stream(bounds).forEach(s-> System.out.println("获取类型变量的上界-->"+s)); Field field2 = TypeVariableTwoDemo.class.getDeclaredField("k");
Type genericType2 = field2.getGenericType();
TypeVariable typeVariable2=(TypeVariable)genericType2;
Type[] bounds2 = typeVariable2.getBounds();
//class java.lang.Object
Arrays.stream(bounds2).forEach(s-> System.out.println("获取类型变量的上界-->"+s));
//class com.yxkj.other.modular.reflection.type.TypeVariableDemo$TypeVariableTwoDemo
System.out.println("获取声明该类型变量实体-->"+typeVariable2.getGenericDeclaration());
//K
System.out.println("获取声明该类型变量实体-->"+typeVariable2.getName());
}
}

GenericArrayType

  • 含义:

    泛型数组类型,用来描述ParameterizedType、TypeVariable类型的数组;即List[] 、T[]等;
  • 代码:
private T[] t;

    private List<String>[] listArray;

    /**
* 泛型数组类型,例如List<String>[] 、T[]等;
*
**/
@Test
public void test() throws NoSuchFieldException {
Field t = GenericArraytypeDemo.class.getDeclaredField("t");
Type genericType = t.getGenericType();
//sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl
System.out.println("获取Type的实际类型-->"+genericType.getClass().getName());
} @Test
public void test2() throws NoSuchFieldException {
Field t = GenericArraytypeDemo.class.getDeclaredField("listArray");
Type genericType = t.getGenericType();
GenericArrayType genericType1 = (GenericArrayType) genericType;
Type genericComponentType = genericType1.getGenericComponentType();
//java.util.List<java.lang.String>
System.out.println("获取listArray的实际类型-->"+genericComponentType);
}

Class

  • 含义:

    上三者不同,Class是Type的一个实现类,属于原始类型,是Java反射的基础,对Java类的抽象;

在程序运行期间,每一个类都对应一个Class对象,这个对象包含了类的修饰符、方法,属性、构造等信息,所以我们可以对这个Class对象进行相应的操作,这就是Java的反射;

*代码:

private ClassDemo classDemo;

    /**
*
* 在Java中,每个.class文件在程序运行期间,都对应着一个Class对象,
* 这个对象保存有这个类的全部信息;因此,Class对象也称之为Java反射的基础
*
**/
@Test
public void test() throws NoSuchFieldException {
Field field = ClassDemo.class.getDeclaredField("classDemo");
Type genericType = field.getGenericType();
//class com.yxkj.other.modular.reflection.type.ClassDemo
System.out.println("获取Type原始类型-->"+genericType);
}

WildcardType

  • 含义:

    泛型表达式(或者通配符表达式),即? extend Number、? super Integer这样的表达式;WildcardType虽然是Type的子接口,但却不是Java类型中的一种;

    *代码:
    private List<? extends Number> listNum;

    private List<? super String> listStr;

    /**
*
* ?---通配符表达式,表示通配符泛型,但是WildcardType并不属于Java-Type中的一钟;
* 例如:List<? extends Number> 和 List<? super Integer>;
*
**/
@Test
public void test() throws NoSuchFieldException {
Field declaredField = WildcardTypeDemo.class.getDeclaredField("listNum");
Type genericType = declaredField.getGenericType();
ParameterizedType parameterizedType=(ParameterizedType)genericType;
//获取泛型中的实际类型
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
//class sun.reflect.generics.reflectiveObjects.WildcardTypeImpl
System.out.println("获取泛型中的实际类型-->"+actualTypeArguments[0].getClass());
WildcardType wildcardType= (WildcardType)actualTypeArguments[0]; Type[] upperBounds = wildcardType.getUpperBounds();
System.out.println("获取泛型变量的上边界-->"+upperBounds[0]); Field declaredFieldlowerBounds = WildcardTypeDemo.class.getDeclaredField("listStr");
Type genericTypelowerBounds = declaredFieldlowerBounds.getGenericType();
ParameterizedType parameterizedTypelowerBounds=(ParameterizedType)genericTypelowerBounds;
//获取泛型中的实际类型
Type[] actualTypeArgumentslowerBounds = parameterizedTypelowerBounds.getActualTypeArguments();
WildcardType wildcardTypelowerBounds= (WildcardType)actualTypeArgumentslowerBounds[0]; Type[] lowerBounds = wildcardTypelowerBounds.getLowerBounds(); System.out.println("获取泛型变量的下边界-->"+lowerBounds[0]); }

Gitee案例地址

https://gitee.com/zhuayng/foundation-study/tree/develop/JavaBasis/Other/src/main/java/com/yxkj/other/modular/reflection/type

参考

https://www.cnblogs.com/linghu-java/p/8067886.html

Java中Type接口及其子类的更多相关文章

  1. java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析

    java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...

  2. 第五节:详细讲解Java中的接口与继承

    前言 大家好,给大家带来详细讲解Java中的接口与继承的概述,希望你们喜欢 什么是接口(interface) 接口中的方法都是抽象方法,public权限,全是抽象函数,不能生成对象 interface ...

  3. JAVA中限制接口流量、并发的方法

    JAVA中限制接口流量可以通过Guava的RateLimiter类或者JDK自带的Semaphore类来实现,两者有点类似,但是也有区别,要根据实际情况使用.简单来说, RateLimiter类是控制 ...

  4. java中map接口hashMap以及Enty之间的用法和关系

    java中map接口hashMap以及Enty之间的转换 首先说的是map接口: Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value ...

  5. Java学习笔记二十八:Java中的接口

    Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...

  6. Java 中的接口有什么作用?以及接口和其实现类的关系?

    Java 中的接口有什么作用? - Ivony的回答 - 知乎 https://www.zhihu.com/question/20111251/answer/16585393 这是一个初学者非常常见的 ...

  7. java中的接口回调

    [接口回调]接口回调是多态的另一种体现.接口回调是指:可以把使用某一个接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法.当接口变量调用被类实现的接口中 ...

  8. 【转载】JAVA中综合接口和抽象类实现的一种“抽象接口”

    Muscleape个人总结:(这里的抽象接口是指:使用一个抽象类实现一个接口,是两部分结构) 使用一个抽象类直接实现接口,将接口中的方法区分为实现类必须要实现的和选择性实现的,其他需要实现接口的类型通 ...

  9. Java中的接口详解

    接口 是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量.构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8) ...

随机推荐

  1. MySQL中视图的定义、原理--触发器

    视图概述 视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用 ...

  2. mybatis 内部定义对象和集合

    mapper 配置文件中  引入两个重要的标签:association和collection标签.

  3. ELBO surgery: yet another way to carve up the variational evidence lower bound

    目录 概 主要内容 Evidence minus posterior KL Average negative energy plus entropy Average term-by-term reco ...

  4. TensorFlow.NET机器学习入门【7】采用卷积神经网络(CNN)处理Fashion-MNIST

    本文将介绍如何采用卷积神经网络(CNN)来处理Fashion-MNIST数据集. 程序流程如下: 1.准备样本数据 2.构建卷积神经网络模型 3.网络学习(训练) 4.消费.测试 除了网络模型的构建, ...

  5. CS229 机器学习课程复习材料-线性代数

    本文是斯坦福大学CS 229机器学习课程的基础材料,原始文件下载 原文作者:Zico Kolter,修改:Chuong Do, Tengyu Ma 翻译:黄海广 备注:请关注github的更新,线性代 ...

  6. Capstone CS5263|DP转HDMI 4K60HZ转换芯片|CS5263芯片|替代PS176芯片

    CS5263是一款DP转HDMI 4K60HZ音视频转换器芯片,不管在功能特性还是应用上都是可以完全替代兼容PS176.PS176是一个Display Port 1.2a到HDMI 2.0协议转换器, ...

  7. 基于Spring MVC + Spring + MyBatis的【学生管理管理系统】

    资源下载:https://download.csdn.net/download/weixin_44893902/45602690 练习点设计:模糊查询.删除.新增 一.语言和环境 实现语言:JAVA语 ...

  8. Swoole 中协程的使用注意事项及协程中的异常捕获

    协程使用注意事项 协程内部禁止使用全局变量,以免发生数据错乱: 协程使用 use 关键字引入外部变量到当前作用域禁止使用引用,以免发生数据错乱: 不能使用类静态变量 Class::$array / 全 ...

  9. [学习笔记] Oracle创建用户、分配权限、设置角色

    创建用户 create user student --用户名 identified by "123456" --密码 default tablespace USERS --表空间名 ...

  10. CSS基础 华为渐变色产品列表 综合实战

    华为网页链接:https://www.huawei.com/cn/?ic_medium=direct&ic_source=surlent html代码部分: <div class=&qu ...