2022-04-14
浏览量1421
Java类型擦除后如何获得泛型信息
Java的class和Type的区别
简单来说,Class是Type的实现,Type是Class的父接口。
Type的多种实现如TypeVariable、ParameterizedType可以在运行时获取类属性变量与方法参数的泛型信息
通过type可以获取比Class更多的信息
Java类型擦除后如何获得泛型信息
众所周知,JVM在创建泛型实例时会把泛型信息擦除,编译生成的字节码中全是原生类型。
但是类型擦除后如何能获取泛型信息呢?
答案就是TypeVariable、ParameterizedType等Type的子接口,可以通过他们获取泛型元数据。
泛型擦除后,类,字段和方法的形参泛型信息是会保存到Signature中的, 可以在反编译后的class 字节码中看到。简单来说在类加载阶段,JVM就将字节码中写死的泛型信息保存了下来。而在反射的时候,反射系统自然就可以获取到该信息,我们可以通过getGenericType()来获取到Type信息,从而解析出泛型类型。
field.getGenericType();
获取类变量的实际泛型类型
parameter.getParameterizedType();
获取方法参数的泛型类型
参考
本来是想就这个问题详细讨论一下,但是查询一些资料后找到了一篇大佬的博文,顿感自惭形秽,水平不足。
在此就简单记录一下,详细的解析可以移步大佬的博客:深入解析JAVA泛型和Type类型体系
评论
添加一条评论