泛型的本质是为了在编译前防止错误参数的输入,在运行过程中无效
首先,由于反射机制是在编译后进行的,Class对象就相当于字节码文件,验证:
ArrayList a1 = new ArrayList();
a1.add("CSDN");
ArrayList<String> a2 = new ArrayList();
Class c1 = a1.getClass();
Class c2 = a2.getClass();
System.out.println(c1==c2);
//true
而我们如果可以通过反射机制来在a1添加一个非String类型的对象,则可证明标题的观点。验证:
Class c = a1.getClass();
try {
Method m = c.getMethod("add", Object.class);
m.invoke(a,100);
for (Object obj:a){
System.out.println(obj.toString());
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//CSDN
//100
拓展
我们可以引用反射机制来创建一个有着不同数据类型的ArrayList对象。
以上大部分内容来源于慕课网的”反射——Java高级开发必须懂的”课程,网址是http://www.imooc.com/learn/199,感谢Cedar老师的辛勤付出!