public class ArrayListDemo {
public static void main(String[] args) throws Exception, SecurityException {
ArrayList<Integer> array = new ArrayList<Integer>();
Class c = array.getClass();
Method m = c.getMethod("add", Integer.class);
m.invoke(array, "java");
m.invoke(array, "world");
m.invoke(array, 8);
System.out.println(array);
}
}
问题: Method m = c.getMethod("add", Integer.class); //这里 为什么不可以 用Integer.class ,求讲一下 原因
ArrayList的add方法应该是没有返回值的, Method m = c.getMethod("add", Integer.class); 第二个参数是指该方法的返回值类型,所以运行时会报错。
改成这样
// Method m = c.getMethod("add", Integer.class); Method m = c.getMethod("add", Object.class);
这里的第二个参数表示的是ArrayList中“add”方法的参数类型。
为什么不能是Integer?因为ArrayList<E>类使用了泛型,泛型在编译后都被原始类型替代,具体的Integer就变成了Object。
在反射的时候,ArrayList<E>实际是ArrayList<Object>,这也是为什么反射之后可以向数组添加字符串的原因,Object是所有类的基类。