

package com.itheima.d6_reflect_genericity;import java.lang.reflect.Method;import java.util.ArrayList;public class ReflectDemo { public static void main(String[] args) throws Exception { // 需求:反射实现泛型擦除后,加入其他类型的元素 ArrayList<String> list1 = new ArrayList<>(); ArrayList<Integer> list2 = new ArrayList<>(); System.out.println(list1.getClass()); // getClass方法获取(ArrayList)class文件对象 System.out.println(list2.getClass()); // class java.util.ArrayList System.out.println(list1.getClass() == list2.getClass()); // true System.out.println("==========================="); ArrayList<Integer> list3 = new ArrayList<>(); // list3 集合对象现在暂时只能添加整型 list3.add(23); list3.add(22);// list3.add("黑马"); 现在不能添加String类型 只能添加整型 // ArrayList对象的add 方法可以 添加任何类型的元素(利用反射,此时集合的泛型将不能产生约束) Class c = list3.getClass(); // ArrayList.class ===>public boolean add(E e) // 定位c类中的add方法 (再编译成Class文件进入运行阶段的时候,其真实类型都是ArrayList了,泛型相当于被擦除了 // 获取ArrayList(c对象)的add方法对象 Method add = c.getDeclaredMethod("add", Object.class);// 该方法的参数是任意类型 // 通过调用invoke方法来执行对象的某个方法(这里的方法是add方法,因为add是ArrayList(c)的add方法对象 // invoke方法是调用了方法对象的add方法类型的值,要将他转成成true boolean rs = (boolean) add.invoke(list3, "黑马");// invoke调用list3对象,使用特指的add方法,传入的参数是黑马 System.out.println(rs); // true // 代表添加成功 System.out.println(list3); //[23, 22, 黑马]// ArrayList 类型的集合,可以添加任何元素 ArrayList list4 = list3; list4.add("白马"); list4.add(false); System.out.println(list3); //[23, 22, 黑马, 白马, false] }}