在学习反射注入,我现在的问题是,比如我有一个属性是list>
我使用.getActualTypeArguments()之后获得都是wildcardtype,这个应该不能转为clas
请问各位大牛如何正确获取这种参数示范性,并通过反射新建一个同类型的对象?
java 反射 parameterizedtype wildcardtype 获取参数并new 对象
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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里面插入数据不会有类型检查。
解决 2无用
悬赏问题
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
- ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
- ¥20 有关区间dp的问题求解
- ¥15 多电路系统共用电源的串扰问题
- ¥15 slam rangenet++配置
- ¥15 有没有研究水声通信方面的帮我改俩matlab代码
- ¥15 ubuntu子系统密码忘记
- ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
- ¥15 保护模式-系统加载-段寄存器
- ¥15 电脑桌面设定一个区域禁止鼠标操作