image.pngimage.png

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