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

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

1个回答

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

  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里面插入数据不会有类型检查。

wpbuaa
wpbuaa 上个回复有错别字,是spring注入的时候并不知道什么类型,如果我问题描述的不清楚麻烦指出来
接近 3 年之前 回复
wpbuaa
wpbuaa 就是,现在我知道list中的类型是map,但是spring注入的时候并不是到什么类型,这样我们就需要getRwaype转为class,再对class进行条件判断,确定实际是哪一种对象。我这样的想法可行吗?
接近 3 年之前 回复
wpbuaa
wpbuaa 谢谢!看了您的代码我很受启发,然后看了看type ,parametertype的api。有一点思路想向您请教一下对不对
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问