首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何通过Java反射获取泛型类型信息

{//......} (2)在里面使用一个泛型 比如在Java的LinkedList的源码中,有两个成员变量定义如下,分别代表链表的头和尾: transient Node first...; transient Node last; ok,在上面的两种场景中,第一种场景在和接口上声明的泛型,在运行时反射该类,是没法知道其参数信息的,包括对象本身也不知道它的泛型是什么。...不能通过发射获取泛型类型信息的场景有二个,分别是: (1)或接口声明的泛型信息 (2)局部变量的泛型信息 获取方法返回值的泛型类型 如下面定义的一个测试: public class MyClass...){ ParameterizedType parameterizedType=(ParameterizedType) genericsFieldType; Type...){ ParameterizedType parameterizedType=(ParameterizedType)genericType; Type

8.9K21
您找到你想要的搜索结果了吗?
是的
没有找到

细说java.lang.reflect.Type(ParameterizedType、TypeVariable、WildcardType...)

此时,所有的原始类型都通过字节码文件Class进行抽象。Class的一个具体对象就代表一个指定的原始类型 泛型出现之后,扩充了数据类型。...**Class —— 反射基石 其意义为:的抽象,即对“”做描述:比如有修饰、字段、方法等属性,有获得该类的所有方法、所有公有方法等方法。...那我们其实就可以通过定义的方式,在信息中保留泛型信息,从而在运行时获得这些泛型信息。...) parameterizedType.getActualTypeArguments()[0]; } // 省略具体的操作.... } 说明:Class有两个"雷同"的方法:...此时,所有的原始类型都通过字节码文件Class进行抽象。Class的一个具体对象就代表一个指定的原始类型。 泛型出现之后,也就扩充了数据类型。

3K10

基础篇:深入解析JAVA泛型

1 JAVA的Type类型体系 先了解下java的Type类型体系(=>类型),Type是所有类型(原生类型-Class、参数化类型-Parameterizedtype、数组类型-GenericArrayType...Type下面又有四个子接口ParameterizedType、TypeVariable、GenericArrayType、WildcardType List表示泛型,E是TypeVariable...,可以是已知(Integer、String等),也可以用子类自己的泛型参数指定 泛型被继承时,且指定父泛型参数,则额外生成的ParameterizedType类型作为子类的父;如果没有指定父泛型参数...) // 2 获取在内部定义的泛型属性,需指定具体泛型参数 // 3 局部代码,可以通过泛型的匿名内部子类(需指定具体泛型参数)获取ParameterizedType类型 public class MainTest...但是泛型+具体参数转变的ParameterizedType(参数化类型)是不存在继承关系;即Object是String的父,但是List和List的类型是不同的两个ParameterizedType

1.3K20

通过泛型获得子类Class类型 以及Type体系

,如果父的方法中需要知道具体子类的Class类型 则可以直接使用Child来使用;   此处的原理就是在子类继承父的时候 带有泛型 然后子类在创建的时候,会调用父的构造函数,构造函数中存在this...指的的是子类,然后通过获得父,再获得父的泛型 ;通过泛型找到子类类型; 3、原理分析   该实现是通过反射技术实现;下面看具体的分析; 3、1 ParameterizedType ParameterizedType...pType = (ParameterizedType) maps.getClass().getGenericSuperclass();//获得HashMap的父 System.out.println...Class)的区别 3、2 Type    Type是java类型信息体系中的顶级接口,其中Class就是Type的一个直接实现。...ParameterizedType parameterizedType = (ParameterizedType) type; Type[] actualTypeArguments

4.6K20

泛型,有点难度,会让很多人懵逼,那是因为你没有看这篇文章!

泛型变量可以在和方法中进行声明,从上面图中也可以看出来,java中任何可以使用Class对象表示,方法可以用Method表示,图中可以知,Class和Method实现了GenericDeclaration...class对象,通过Class对象可以获取或者接口中的任何信息,比如:名、中声明的泛型信息、的修饰符、的父信息、的接口信息、中的任何方法信息、中任何字段信息等等。...instanceof ParameterizedType) {//@6 ParameterizedType parameterizedType = (ParameterizedType...@4:输出了genericSuperclass变量的类型,注意上面第2行输出:ParameterizedTypeImpl,这个是ParameterizedType接口的一个实现。...instanceof ParameterizedType) { //@4 ParameterizedType parameterizedType = (ParameterizedType

88320

深入分析Java反射(三)-泛型

既然Java虚拟机中不存在泛型,那么为什么可以从JDK中的一些库获取泛型信息?...这是因为文件(.class)或者说字节码文件本身存储了泛型的信息,相关库(可以是JDK的库,也可以是第三方的库)读取泛型信息的时候可以从字节码文件中提取,例如比较常用的字节码操作库ASM就可以读取字节码中的信息甚至改造字节码动态生成...> list; class MyClass{ } 而像下面的忽略泛型参数或者基本数据类型和基本数据类型的包装都不是ParameterizedType: String name = "throwbale...//获取父泛型类型数组 Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();...Type[] getBounds():获得该类型变量的上限(上边界),若无显式定义(extends),默认为Object,类型变量的上限可能不止一个,因为可以用&符号限定多个(这其中有且只能有一个为或抽象

1.5K20

我眼中的Java-Type体系(1)1.ParameterizedType2.TypeVariable3.GenericArrayType4.Class5.WildcardType

)、数组类型(GenericArrayType)、类型变量(TypeVariable)、基本类型(Class); 原始类型,不仅仅包含我们平常所指的,还包括枚举、数组、注解等; 参数化类型,就是我们平常所用到的泛型...ParameterizedType源码 2.TypeVariable 类型变量,即泛型中的变量;例如:T、K、V等变量,可以表示任何;在这需要强调的是,TypeVariable代表着泛型中的变量,而ParameterizedType...TypeVariable源码 3.GenericArrayType 泛型数组类型,用来描述ParameterizedType、TypeVariable类型的数组;即List[] 、T[]等; ?...GenericArrayType源码 4.Class 上三者不同,Class是Type的一个实现,属于原始类型,是Java反射的基础,对Java的抽象; 在程序运行期间,每一个都对应一个Class...对象,这个对象包含了的修饰符、方法,属性、构造等信息,所以我们可以对这个Class对象进行相应的操作,这就是Java的反射; 5.WildcardType 泛型表达式(或者通配符表达式),即?

1.1K60
领券