Java类型擦除后如何获得泛型信息

浏览量395

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类型体系

评论

添加一条评论