反射擦除是指,一个类在编译之前有泛型约束,在编译后的字节码文件里没有泛型约束;
这么做的目的是防止同一个类生成多个class文件占用内存,一个类对应一个class文件。
我们可以通过反射来验证泛型在字节码文件里被擦除:
public static void main(String[] args) throws Exception {
List<String> stringList = new ArrayList<>();
List<Integer> intList = new ArrayList<>();
Class clazz = intList.getClass();
Method methodAdd = clazz.getDeclaredMethod("add",Object.class);//正确获取姿势
/* Method methodAdd1 = clazz.getDeclaredMethod("add",String.class);*///会抛出NoSuchMethod异常
methodAdd.invoke(stringList,"Hello");
stringList.forEach(System.out::println);
}