反射与泛型擦除
一般来讲,Java集合接口类似于List,Set等接口,在声明定义或者往其中第一次添加元素后,往其中添加的类型是不能改变的(Objdect类除外),实例如下:
public class Demo { public static void main(String[] args) { List<Integer> list = new ArrayList(); list.add(123); list.add("258"); for (Object o : list) { System.out.println(o); } } }
此时运行程序会抛出异常:Integer和String参数类型不匹配,那么如何使list中能够添加String类型呢?
实际上查看ArrayList实现,其存储元素的方式是一个Object数组,取出时通过强制转换实现,
transient Object[] elementData; // non-private to simplify nested class access
这时可以通过反射实现添加不同类型的元素,方法和结果如下:
public class Demo { public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { List<Integer> list = new ArrayList(); list.add(123); Method method = list.getClass().getMethod("add",Object.class);//不用Object同样会报错 method.invoke(list,"添加了字符串"); for(Object o:list){ System.out.println(o); } } } —————————————————————————————————————————————————— 123 添加了字符串 Process finished with exit code 0