Java反射系列--Type接口及其子接口

article/2025/8/25 0:42:44

原文网址:Java反射系列--Type接口及其子接口_IT利刃出鞘的博客-CSDN博客

简介

说明

        Type 是java反射机制中提供的一个接口,用来表示java中的所有类型的接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。(这段话是Type源码的注释中写的)。

  • 原始类型:一般意义上的java类,由class类实现
  • 参数化类型:ParameterizedType接口的实现类
  • 数组类型:GenericArrayType接口的实现类
  • 类型变量:TypeVariable接口的实现类
  • 基本类型:int,float等java基本类型。(其实也是class)

        Type类几乎在各种框架中都能看到,尤其是涉及代理,反射的地方。理解好Type类也会对今后框架封装、源码解读有很大好处。

Type接口源码

package java.lang.reflect;/*** Type is the common superinterface for all types in the Java* programming language. These include raw types, parameterized types,* array types, type variables and primitive types.** @since 1.5*/
public interface 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的子接口/子类

Type的子接口/子类是这样的:

实例

下边我只用字段进行示例。方法、类都是一样的用法。

Class

Class的方法实在太多了,毕竟它包含了类的所有信息。详细可见这里:Java--反射--使用/应用/实例_IT利刃出鞘的博客-CSDN博客

本处只做一个简单的示例。

package com.example.a;import java.lang.reflect.Field;
import java.lang.reflect.Method;class ClassTest{private String userName;public void sayHello() {System.out.println("Hello");}
}public class Demo {public static void main(String[] args) {Field[] declaredFields = ClassTest.class.getDeclaredFields();Method[] declaredMethods = ClassTest.class.getDeclaredMethods();for (Field declaredField : declaredFields) {System.out.println(declaredField.getName());}for (Method declaredMethod : declaredMethods) {System.out.println(declaredMethod.getName());}}
}

ParameterizedType

参数化类型,即带泛型的类型;例如:List<T>、Map<K,V>。

源码

public interface ParameterizedType extends Type {//获取参数化类型参数。例如:Map<K,V>,则为K/V数组;Type[] getActualTypeArguments();//获取原始类型,泛型类型。例如:List<T> ,则为 ListType getRawType();//如果是内部类,获取拥有内部类的外部类。例如:Map.Entry<K,V>,则为MapType getOwnerType();
}

实例

package com.example.a;import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;class ParameterizedTypeTest<T> {private List<T> tList;private Map<String, Integer> stringIntegerMap;
}public class Demo {public static void main(String[] args) {Field[] declaredFields = ParameterizedTypeTest.class.getDeclaredFields();for (Field declaredField : declaredFields) {// 获得字段的类型Type type = declaredField.getGenericType();if (type instanceof ParameterizedType) {ParameterizedType parameterizedType = (ParameterizedType) type;// 参数类型名。输出:List<T> 和 Map<String,Integer>System.out.println("typeName:  " + parameterizedType.getTypeName());// 父类。本处都是NullSystem.out.println("ownerType: " + parameterizedType.getOwnerType());// 原始类型。输出:interface java.util.List/MapSystem.out.println("rawType:   " + parameterizedType.getRawType());// 参数实际类型。输出:T和java.lang.String/Integerfor (Type arguments : parameterizedType.getActualTypeArguments()) {System.out.println(arguments.getTypeName());}}System.out.println("----------------------------------");}}
}

运行结果

typeName:  java.util.List<T>
ownerType: null
rawType:   interface java.util.List
T
----------------------------------
typeName:  java.util.Map<java.lang.String, java.lang.Integer>
ownerType: null
rawType:   interface java.util.Map
java.lang.String
java.lang.Integer
----------------------------------

TypeVariable

类型变量,即泛型中的变量;例如:T、K、V等变量,可以表示任何类;

TypeVariable代表着泛型中的变量,而ParameterizedType则代表整个泛型。

源码

public interface TypeVariable<D extends GenericDeclaration> extends Type, AnnotatedElement {//获得该类型变量的上限,也就是泛型中extend右边的值;//  例如: List<T extends Number> ,Number就是类型变量T的上限;Type[] getBounds();//获取声明该类型变量实体D getGenericDeclaration();String getName();AnnotatedType[] getAnnotatedBounds();
}

实例

package com.example.a;import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.List;
import java.util.Map;class TypeVariableTest<T> {private List<Integer> integerList;private Map<String, T> stringTMap;
}public class Demo {public static void main(String[] args) {Class<TypeVariableTest> clazz = TypeVariableTest.class;Field[] declaredFields = clazz.getDeclaredFields();for (Field declaredField : declaredFields) {Type type = declaredField.getGenericType();if (type instanceof ParameterizedType) {ParameterizedType parameterizedType = (ParameterizedType)type;for (Type type1 : parameterizedType.getActualTypeArguments()) {if (type1 instanceof TypeVariable) {TypeVariable typeVariable = (TypeVariable) type1;System.out.println("字段名:            " + declaredField.getName());System.out.println("typeName:           " + typeVariable.getTypeName());System.out.println("genericDeclaration: " +typeVariable.getGenericDeclaration());}}}}}
}

执行结果

字段名:            stringTMap
typeName:           T
genericDeclaration: class com.example.a.TypeVariableTest

可以发现,经过代码的过滤后,只获取到了T。

GenericArrayType

简介

        泛型数组类型,用来描述ParameterizedType、TypeVariable类型的数组;例如:List<T>[] 、T[]、List<Integer>[]等。不包含String[]、int[]这种。

源码

public interface GenericArrayType extends Type {//可以获取到数组前面的类型。例如:List<String>[]为List<String>Type getGenericComponentType();
}

实例

package com.example.a;import java.lang.reflect.*;
import java.util.List;class TypeVariableTest<T> {private T[] ts;private Integer[] integers;private List<Integer>[] integerList;private List<T>[] tLists;
}public class Demo {public static void main(String[] args) {Class<TypeVariableTest> clazz = TypeVariableTest.class;Field[] declaredFields = clazz.getDeclaredFields();for (Field declaredField : declaredFields) {Type type = declaredField.getGenericType();if (type instanceof GenericArrayType) {GenericArrayType genericArrayType = (GenericArrayType)type;System.out.println("字段名:              " + declaredField.getName());System.out.println("typeName:             " +genericArrayType.getTypeName());System.out.println("genericComponentType: " +genericArrayType.getGenericComponentType());}System.out.println("------------------------------------------");}}
}

执行结果

字段名:              ts
typeName:             T[]
genericComponentType: T
------------------------------------------
------------------------------------------
字段名:              integerList
typeName:             java.util.List<java.lang.Integer>[]
genericComponentType: java.util.List<java.lang.Integer>
------------------------------------------
字段名:              tLists
typeName:             java.util.List<T>[]
genericComponentType: java.util.List<T>
------------------------------------------

 可见:Integer[]这种不属于GenericArrayType

WildType

简介

泛型表达式(通配符表达式)。例如:? extend Number、? super Integer。

WildcardType虽然是Type的子接口,但却不是Java类型中的一种。

源码

public interface WildcardType extends Type {// 获取上边界。例如:List<? extends Number>,则为NumberType[] getUpperBounds();// 获取下边界。例如:List<? super String>, 则为StringType[] getLowerBounds();
}

实例 

package com.example.a;import java.lang.reflect.*;
import java.util.Arrays;
import java.util.List;class TypeVariableTest {private List<? extends Integer> integerList;
}public class Demo {public static void main(String[] args) {Class<TypeVariableTest> clazz = TypeVariableTest.class;Field[] declaredFields = clazz.getDeclaredFields();for (Field declaredField : declaredFields) {Type type = declaredField.getGenericType();if (type instanceof ParameterizedType) {ParameterizedType parameterizedType = (ParameterizedType) type;Type[] typeArguments = parameterizedType.getActualTypeArguments();System.out.println("字段名:     " + declaredField.getName());for (Type type1 : typeArguments) {if (type1 instanceof WildcardType) {WildcardType wildcardType = (WildcardType) type1;System.out.println("typeName:    " + wildcardType.getTypeName());System.out.println("upperBounds: " +Arrays.toString(wildcardType.getUpperBounds()));}}}}}
}

执行结果

字段名:     integerList
typeName:    ? extends java.lang.Integer
upperBounds: [class java.lang.Integer]

框架对Type的应用

Mybatis

org.apache.ibatis.reflection.Reflector中的typeClass方法将Type类型对象转换为Class对象。

private Class<?> typeToClass(Type src) {Class<?> result = null;// 如果src是Class类型的实例则直接进行强制类型转换if (src instanceof Class) {result = (Class<?>) src;// 如果src是参数类型则获取其原始类型Class对象;} else if (src instanceof ParameterizedType) {result = (Class<?>) ((ParameterizedType) src).getRawType();// 如果src是数组泛型类型,则分情况处理} else if (src instanceof GenericArrayType) {Type componentType = ((GenericArrayType) src).getGenericComponentType();if (componentType instanceof Class) {result = Array.newInstance((Class<?>) componentType, 0).getClass();} else {Class<?> componentClass = typeToClass(componentType);result = Array.newInstance(componentClass, 0).getClass();}}if (result == null) {result = Object.class;}return result;
}

其他网址

Java Type类及其子类用途 - 简书
java Type 及其子类介绍_qq_37718687的博客-CSDN博客


http://chatgpt.dhexx.cn/article/L08O6DNa.shtml

相关文章

秒懂所有USB接口类型,USB接口大全;Type-A、Type-B、Type-C、miniUSB、microUSB区分

我们来聊一聊USB接口。由于USB-IF标准制定命名的混乱&#xff0c;大多数人都搞不清楚USB的各种版本命名&#xff0c;这里我们就好好捋一捋。。。 一、USB传输标准 自1996年USB-IF&#xff08;USB Implementers Forum&#xff09;组织发布USB 1.0标准以来&#xff0c;USB标准经…

Type-c接口及其协议介绍

一、Type-c接口支持的功能 支持接口正反插&#xff1b; 定义Vbus的电流传输能力&#xff1b; 定义功率传输角色&#xff0c;即供电端及受电端&#xff1b; 定义数据传输角色&#xff0c;主机或从机&#xff1b; 支持PD协议&#xff0c;实现大功率充电&#xff1b; 支持US…

Type-C接口相关知识

注&#xff1a;内容来自网络&#xff0c;侵删....... Type-C接口详细定义及常用功能 因为Type-C接口比Micro USB有更多的优点&#xff0c;比如&#xff0c;充电时不分正反&#xff0c;随便插&#xff1b;充电时&#xff0c;允许通过的最大电流更大等。现在越来越多的手机用Ty…

Type接口的基础知识

Type是所有类型的父接口,它有四个子接口和一个实现类 下面来看这些子接口和子类所代表的类型 Class表示的是原始类型。Class类的对象表示JVM中的一个类或者接口,每个java类在JVM都表现为一个Class对象。可以通过“类名.Class”、“对象.getClass()”或者Class.forName("…

负载均衡案例

RabbitMQ集群高可用 1.MQ节点互为镜像 2.HAproxy负载均衡 3.Keeplived高可用 RabbitMQ 的4种集群架构 RabbitMQ 的4种集群架构 - 简书 主备模式&#xff08;高可用&#xff09; 主节点提供读写&#xff0c;备用节点不提供读写。如果主节点挂了&#xff0c;就切换到备用节点…

防火墙负载均衡解决方案

近期项目当中遇到了防火墙负载均衡的需求&#xff0c;拿出来和大家探讨一下。 用户在项目中采购了4台国内某知名品牌的高端防火墙&#xff0c;原本打算通过防火墙自身集群的方式实现防火墙的负载分担和冗余部署&#xff0c;可惜防火墙厂商的答复是如果采用集群的方式&#xff0…

docker 应用负载均衡解决方案

项目中使用SpringBoot开发web应用&#xff0c;打包部署采用docker&#xff1b;之前看到通过docker-compose 来扩展容器&#xff0c;通过scale命令来扩展容器: docker-compose scale test-app4 但是试了下发现直接报错了&#xff0c;端口冲突&#xff0c;因为每个docker容器都…

Oracle 负载均衡解决方案

为什么要运用负载均衡 一般我们在数据库中的操作无非不就是增删改查这四个基本操作&#xff0c;最终数据库和磁盘文件打交道也就是读写操作。如果采用传统的一台服务器去运作&#xff0c;可能会在读写高峰时会出现一些无法预知的问题。这些我们或许可以通过优化应用代码结构&a…

两台web服务器实现负载均衡的解决方案

写在前面&#xff1a;如果此文有幸被某位朋友看见并发现有错的地方&#xff0c;希望批评指正。如有不明白的地方&#xff0c;愿可一起探讨。 总体方案 平台规划拓扑图如下&#xff1a; 总体解决方案&#xff1a; 两台web服务通过DNS实现负载均衡&#xff0c;共享NFS服务器&…

负载均衡的硬件与软件实现方案

一、什么是负载均衡 负载均衡是分摊到多个操作单元上进行执行&#xff0c;例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等&#xff0c;从而共同完成工作任务。建立在现有网络结构之上&#xff0c;它提供了一种廉价有效透明的方法扩展网络设备和服务器的带…

分布式及负载均衡解决方案

一、问题域 nginx、lvs、keepalived、f5、DNS轮询&#xff0c;每每提到这些技术&#xff0c;往往讨论的是接入层的这样几个问题&#xff1a; 1&#xff09;可用性&#xff1a;任何一台机器挂了&#xff0c;服务受不受影响 2&#xff09;扩展性&#xff1a;能否通过增加机器&…

阿里云的网站负载均衡解决方案

2015年5月&#xff0c;国务院印发了《关于进一步做好新形势下就业创业工作的意见》&#xff0c;全国范围内刮起了“大众创业&#xff0c;万众创新”的高潮。于是中关村电子市场悄然改成了创业大街&#xff0c;美食街变成了创业公社&#xff0c;就连公司的地下室也一夜之间成了创…

实现负载均衡的2种解决方案

注: NAT 为网络地址转移, 访问进来时, 最初以LVS将访问进行地址转移到内部的Nginx, 由 Nginx 进行负载均衡

mysql负载均衡完美解决方案

1.环境&#xff1a; mysql 5 ubuntu10.04 x86_64 mdb1 eth0 192.168.5.11 mdb2 eth0 192.168.5.12 sdb1 eth0 192.168.5.21 sdb2 eth0 192.168.5.22 sdb3 eth0 192.168.5.23 sdb4 eth0 192.168.5.24 haproxy…

负载均衡-

常见的负载均衡系统包括 3 种&#xff1a;DNS 负载均衡、硬件负载均衡和软件负载均衡。 DNS 负载均衡 DNS 是最简单也是最常见的负载均衡方式&#xff0c;一般用来实现地理级别的均衡。例如&#xff0c;北方的用户访问北京的机房&#xff0c;南方的用户访问深圳的机房。DNS 负…

负载均衡的解决方案

负载均衡的解决方案 前言 我们在设计分布式系统的时候往往需要考虑系统的伸缩性&#xff0c;这里所说的伸缩性指的是我们可以通过添加服务器节点的方式来提升我们整个系统的并发能力&#xff0c;这种提高伸缩性的基础原理其实就是我们所说的——负载均衡。 正文 负载均衡 …

负载均衡及解决方案

目录 一、什么是负载均衡&#xff1f; 二、负载均衡方案有几种&#xff1f; 1、基于DNS负载均衡 2、基于硬件负载均衡 3、基于软件负载均衡 三、常用的均衡算法有哪些&#xff1f; 1、轮询策略 2、负载度策略 3、响应策略 4、哈希策略 一、什么是负载均衡&#xff1f;…

吃透这份Github点赞120k的Spring全家桶笔记Offer拿到手软

Spring框架自诞生以来一直备受开发者青睐&#xff0c;有人亲切的称之为&#xff1a;Spring 全家桶。它包SpringMVC、SpringBoot、Spring Cloud、Spring Data等解决方案。 很多研发人员把spring看作心目中最好的java项目&#xff0c;没有之一。Spring系列包含非常多的项目&…

分布式事务及解决方案

1、分布式事务 分布式事务就是在一个交易中各个服务之间的相互调用必须要同时成功或者同时失败&#xff0c;保持一致性和可靠性。在单体项目架构中&#xff0c;在多数据源的情况下也会发生 分布式事务问题。本质上来说&#xff0c;分布式事务就是为了保证不同数据库的数据一致性…

负载均衡方案

负载均衡方案 1、负载均衡概念 一台普通服务器的处理能力是有限的&#xff0c;假如能达到每秒几万个到几十万个请求&#xff0c;但却无法在一秒钟内处理上百万个甚至更多的请求。但若能将多台这样的服务器组成一个系统&#xff0c;并通过软件技术将所有请求平均分配给所有服务…