Java反射绕过泛型检查

在java的泛型中,实际上只是编译器认识泛型,而虚拟机是不认识泛型的。简单来讲,在运行时,所有的泛型都是object

泛型检查存在擦除泛型的动作(即编译器认识泛型,而虚拟机不认识泛型),真正运行时,泛型位置仍然使用的是object

       //指定list的泛型为Integer
        ArrayList list = new ArrayList<>();
        //Integer类型的数据可以正常添加
        list.add(1);
        //如果添加String类型的数据,则编译器报错,无法通过编译
        //list.add("a");
        
        //通过反射绕过泛型检查,即泛型擦除
        Class listClass = ArrayList.class;
        Method addMethod = listClass.getMethod("add", Object.class);
        //编译器不再报错,程序也可以正常执行
        addMethod.invoke(list, "a");

你可能感兴趣的:(Java反射绕过泛型检查)