通过反射绕过编译向泛型为String的ArrayList里面添加整型
2015-09-23 16:08
288 查看
反射的操作都是在编译后,在运行的时候,java中集合的泛型是防止错误输入的,
只在编译阶段有效,绕过编译就无效了,编译之后泛型是去泛型化的,利用这一点可以向范型为String的ArrayList里面添加整型
新建ReflectDemo.java
运行结果:
true
2
[hello, 20]
只在编译阶段有效,绕过编译就无效了,编译之后泛型是去泛型化的,利用这一点可以向范型为String的ArrayList里面添加整型
新建ReflectDemo.java
package com.imooc.io; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; public class ReflectDemo { public static void main(String[] args){ ArrayList list = new ArrayList(); ArrayList<String> list2 = new ArrayList<String>(); list2.add("hello"); //由于list2是范型,只能添加String的类型,以下是错误的 //list2.add(20); /* * c1==c2结果返回true说明编译之后集合的泛型是去泛型化的 * Java中集合的泛型,是防止错误输入的,只在编译阶段有效, * 绕过编译就无效了 * 验证:我们可以通过方法的反射来操作,绕过编译 */ Class c1 = list.getClass(); Class c2 = list2.getClass(); System.out.println(c1==c2); try { Method M = c2.getMethod("add", Object.class); M.invoke(list2, 20); System.out.println(list2.size()); System.out.println(list2); //现在不能这样遍历,里面添加了整型 /*for (String string : list1) { System.out.println(string); }*/ } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
运行结果:
true
2
[hello, 20]
相关文章推荐
- 所有前缀在串中出现的次数之和 kmp hdu 3336 count the string
- $()和${}和$(())和(())
- 快速入门系列--MVC--06视图
- 锚点和空链接
- C++ 预处理器
- SVN的搭建与使用
- spring容器创建对象的时机
- Monitoring with Ganglia
- javascript中的this
- 三色旗算法
- 【BLE】CC2541之CC Debugger
- 页面底部的回到顶部的按钮实现
- Java-DES算法加密解密工具类
- Java IO流的学习(1)
- log4j.配置
- UI中地图的使用
- 《Monitoring with Ganglia》 Chapter 1 Introducing Ganglia
- 关于Linux下的crypt加密
- UVa10340——All in all
- Eclipse TypeScript 安装