wpbuaa 2017-04-22 05:34 采纳率: 0%
浏览 1116

java 反射 parameterizedtype wildcardtype 获取参数并new 对象

在学习反射注入,我现在的问题是,比如我有一个属性是list>
我使用.getActualTypeArguments()之后获得都是wildcardtype,这个应该不能转为clas
请问各位大牛如何正确获取这种参数示范性,并通过反射新建一个同类型的对象?

  • 写回答

1条回答 默认 最新

  • yizishou 2017-04-22 07:57
    关注

    在编译时,成员变量的类型是被完整保留了的,所以从成员变量里读取泛型信息是可行的:

      private static List<Map<String, String>> list;
    
      public static void main(String[] args) throws Exception {
        Field field = Test.class.getDeclaredField("list");
        // java.util.List<java.util.Map<java.lang.String, java.lang.String>>
        ParameterizedType listType = (ParameterizedType) field.getGenericType();
        // java.util.Map<java.lang.String, java.lang.String>
        ParameterizedType listArgType = (ParameterizedType) listType.getActualTypeArguments()[0];
        Type[] mapArgTypes = listArgType.getActualTypeArguments();
        // class java.lang.String
        Class<?> mapArgType1 = (Class<?>) mapArgTypes[0];
        // class java.lang.String
        Class<?> mapArgType2 = (Class<?>) mapArgTypes[1];
      } 
    

    但是,临时变量是没有地方存储泛型信息的,比如我在main方法里new了一个List<Map<String, String>>,在运行时我是不可能获取到这个变量的泛型信息的,编译时就被擦除了,所以有人说Java的泛型是假的泛型。

    运行时我们也没办法通过反射创建一个带泛型的List,就算创建了也没有实际意义,因为运行时向List里面插入数据不会有类型检查。

    评论

报告相同问题?

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面