Java反射——通过反射绕过集合泛型的限制

直接上代码:

public class MethodDome2 {
 
    public static void main(String[] args) {
 
        ArrayList list = new ArrayList();
 
        ArrayList list2 = new ArrayList<>();
        list2.add("hello");
        //list2.add(20); // error
        Class c1 = list.getClass();
        Class c2 = list2.getClass();
        //反射的操作都是编译之后的操作
 
        System.out.println(c1 == c2); // true
        /*
       * c1==c2结果返回true说明编译之后集合的泛型是去泛型化的
       * Java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了
       * 验证:我们可以通过方法的反射来操作,绕过编译
       */
 
        try {
            // 通过反射就可以绕过集合泛型的限制
            Method method = c2.getMethod("add", Object.class);
            method.invoke(list2, 20);
            System.out.println(list2.size());
            System.out.println(list2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

“去泛型化”就是指忽略了泛型在集合中的作用。在集合中泛型主要是来防止错误输入的,只在编译阶段有效,而通过反射我们就可以绕过集合泛型的限制可以随意的添加。

输出结果:

2
[hello, 20]

你可能感兴趣的:(Java反射——通过反射绕过集合泛型的限制)