

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]
}
}