Java 获取泛型信息 反射操作泛型

雨点打透心脏的1/2处 2024-03-27 01:43 160阅读 0赞

获取泛型信息

反射操作泛型

  • Java采用泛型擦除的机制来引入泛型,Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换问题,但是,一旦编译完成﹐所有和泛型有关的类型全部擦除
  • 为了通过反射操作这些类型,Java新增了ParameterizedType , GenericArrayType ,TypeVariable和WildcardType几种类型来代表不能被归一到Class类中的类型但是又和原始类型齐名的类型.
  • ParameterizedType:表示一种参数化类型,比如Collection’<‘String’>’
  • GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型
  • TypeVariable:是各种类型变量的公共父接口
  • WildcardType:代表一种通配符类型表达式

    package com.reflection;

    import java.lang.reflect.Method;
    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.util.List;
    import java.util.Map;

    //通过反射获取泛型
    public class Test11 {

  1. public void test01(Map<String,User> map, List<User> list){
  2. }
  3. public Map<String,User> test02(){
  4. System.out.println("test02");
  5. return null;
  6. }
  7. public static void main(String[] args) throws NoSuchMethodException {
  8. Method method = Test11.class.getMethod("test01", Map.class, List.class);
  9. Type[] genericParameterTypes = method.getGenericParameterTypes();
  10. for (Type genericParameterType : genericParameterTypes) {
  11. System.out.println("#"+genericParameterType);
  12. if (genericParameterType instanceof ParameterizedType){
  13. Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
  14. for (Type actualTypeArgument : actualTypeArguments) {
  15. System.out.println(actualTypeArgument);
  16. }
  17. }
  18. }
  19. System.out.println("=========================================================");
  20. method = Test11.class.getMethod("test02", null);
  21. Type genericReturnType = method.getGenericReturnType();
  22. if (genericReturnType instanceof ParameterizedType){
  23. Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
  24. for (Type actualTypeArgument : actualTypeArguments) {
  25. System.out.println(actualTypeArgument);
  26. }
  27. }
  28. }
  29. }

代码运行结果:
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,160人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java获取类型信息

    根据使用泛型位置的不同可以分为:声明侧泛型、使用侧泛型。 声明侧的泛型信息被记录在Class文件的Constant pool中以Signature的形式保存。而使用侧的泛型信

    相关 Java反射操作接口

    通过反射获取到抽象类或者接口中泛型信息的操作也是很常见的。实际上开发中,解析后台数据的Json数据,生成对应的泛型实体类,会用到反射获取泛型信息的操作。 实战案例 ----