通过反射了解集合泛型的本质

转载请注明:

通过Class,Method来认识泛型的本质

反射的操作都是编译之后的操作,即运行时刻进行操作 c1==c2结果返回true,说明编译之后,集合的泛型是去泛型化的 就是说编译之后这个集合没有泛型了。 java中集合的泛型是防止错误输入的,只在编译阶段有效, 过了编译就无效了。 验证:我们可以通过方法的反射来操作,绕过编译 package com.test;import java.lang.reflect.Method;import java.util.ArrayList;/**** @author wonderq*/public class within {public static void main(String[] args) {ArrayList list=new ArrayList();ArrayList<String> list1=new ArrayList<String>();list1.add("hello");// list1.add(5); 错误的Class c1=list.getClass();Class c2=list1.getClass();System.out.println("c1==c2? "+(c1==c2));System.out.println("c1和c2分别是:"+c1.getName()+","+c2.getName());/*反射的操作都是编译之后的操作,即运行时刻进行操作c1==c2结果返回true,说明编译之后,集合的泛型是去泛型化的就是说编译之后这个集合没有泛型了。java中集合的泛型是防止错误输入的,只在编译阶段有效,过了编译就无效了。验证:我们可以通过方法的反射来操作,绕过编译*/try {Method m=c2.getMethod("add", Object.class);m.invoke(list1, 100);//本来里面是加入String类型的对象,现在加入一个100//我们看看能不能加进去。System.out.println(list1.size());System.out.println(list1);//是可以加进去的,现在就绕过了泛型,,因为反射的操作都是编译之后的操作for(String string:list1){System.out.println(string);}//此时打印不出来里面的int 类型的100这个数} catch (Exception e) {}}}

运行结果:

run:c1==c2? truec1和c2分别是:java.util.ArrayList,java.util.ArrayList2[hello, 100]hello

可以看出来,反射的操作,class

,method 等,都是绕过编译,在运行时刻运行。

看着它洗涤一缕缕阳光,看着它映衬一片片星辉,

通过反射了解集合泛型的本质

相关文章:

你感兴趣的文章:

标签云: