• 反射的作用( 越过泛型检查 和 可以使用反射保存所有对象的具体信息 )


    1、绕过 编译阶段 为集合添加数据

    • 反射是作用在运行时的技术,此时集合的泛型将不能产生约束了,此时是可以 为集合存入其他任意类型的元素的
    • 泛型只是在编译阶段可以约束集合只能操作某种数据类型,在 编译成Class文件进入 运行阶段 的时候,其真实类型都是不带泛型的集合,泛型相当于被擦除了。
    1. package com.csdn.d6_reflect_genericity;
    2. import java.lang.reflect.InvocationTargetException;
    3. import java.lang.reflect.Method;
    4. import java.util.ArrayList;
    5. public class ReflectDemo {
    6. public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    7. //需求:反射实现泛型擦除后,加入其他类型的元素
    8. ArrayList list1 = new ArrayList<>();
    9. ArrayList list2 = new ArrayList<>();
    10. System.out.println(list1.getClass());//class java.util.ArrayList
    11. System.out.println(list2.getClass());//class java.util.ArrayList
    12. System.out.println(list1.getClass() == list2.getClass());//true
    13. System.out.println("===============================");
    14. ArrayList list3 = new ArrayList<>();
    15. list3.add(23);
    16. list3.add(22);
    17. Classextends ArrayList> aClass = list3.getClass();
    18. Method add = aClass.getDeclaredMethod("add", Object.class);
    19. boolean rs = (boolean) add.invoke(list3, "反射");
    20. System.out.println(rs);//true
    21. System.out.println(list3);//[23, 22, 反射]
    22. ArrayList list4 = list3;
    23. list4.add("注解");
    24. list4.add(false);
    25. System.out.println(list3);//[23, 22, 反射, 注解, false]
    26. }
    27. }

    1.1、反射为何可以给约定了泛型的集合存入其他类型的元素?

    • 编译成Class文件进入运行阶段 的时候,泛型会自动擦除
    • 反射是作用在 运行时 的技术,此时已经不存在泛型了 。

     2、通用框架的底层原理

    需求

    • 给定任意一个对象,在不清楚对象字段的情况下,可以把对象的字段名称和对应值存储到文件中去。

    分析

    1. 定义一个 方法 ,可以接收任意类的对象
    2. 每次收到一个对象后,需要解析这个对象的 全部成员变量名称
    3. 这个对象可能是 任意 的,那么怎么样才可以知道这个对象的全部成员变量名称呢
    4. 使用 反射 获取对象的 Class类对象 ,然后获取全部成员变量信息
    5. 遍历成员变量信息,然后提取本成员变量在对象中的 具体值
    6. 存入成员变量名称和值到 文件 中去即可
    1. package com.csdn.d7_reflect_framework;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. import java.io.FileNotFoundException;
    6. import java.io.FileOutputStream;
    7. import java.io.PrintStream;
    8. import java.lang.reflect.Field;
    9. /**
    10. * 目标:提供一个通用框架,支持保存所有对象的具体信息。
    11. */
    12. public class ReflectDemo {
    13. public static void main(String[] args) {
    14. Student student = new Student("反射", '男', 100, "JavaSE", "暴力访问");
    15. MybatisUtil.save(student);
    16. Teacher teacher = new Teacher("注解", '女', 10000);
    17. MybatisUtil.save(teacher);
    18. }
    19. }
    20. class MybatisUtil {
    21. public static void save(Object object) {
    22. try {
    23. try (PrintStream ps = new PrintStream(new FileOutputStream("reflect\\src\\main\\java\\com\\csdn\\d7_reflect_framework\\object.txt",true))) {
    24. //1、提取这个对象的全部成员变量:只能反射可以解决
    25. Class aClass = object.getClass();
    26. ps.println("==============" + aClass.getSimpleName() + "================");
    27. //2、提取它的全部成员变量
    28. Field[] fields = aClass.getDeclaredFields();
    29. //3、获取成员变量的信息
    30. for (Field field : fields) {
    31. String name = field.getName();
    32. //提取本成员变量的object对象中的值(取值)
    33. field.setAccessible(true);
    34. String value = field.get(object) + "";
    35. ps.println(name + "=" + value);
    36. }
    37. }
    38. } catch (IllegalAccessException | FileNotFoundException e) {
    39. throw new RuntimeException(e);
    40. }
    41. }
    42. }
    43. @Data
    44. @AllArgsConstructor
    45. @NoArgsConstructor
    46. class Student {
    47. private String name;
    48. private char sex;
    49. private int age;
    50. private String className;
    51. private String hobby;
    52. }
    53. @Data
    54. @AllArgsConstructor
    55. @NoArgsConstructor
    56. class Teacher {
    57. private String name;
    58. private char sex;
    59. private double salary;
    60. }

     

     3、反射的作用?

    • 可以在运行时得到一个 类的 全部成分 然后操作
    • 可以 破坏封装性(很突出)
    • 也可以 破坏泛型的约束性(很突出)
    • 更重要的用途是适合:做 Java 高级框架
  • 相关阅读:
    对于一个即将上线的网站,如何测试
    Android ANR问题定位 实战
    JAVA计算机毕业设计延安市图书馆管理Mybatis+系统+数据库+调试部署
    算法|Day52 单调栈3
    Mybatis-Plus入门(新版3.5.2)
    力扣刷题篇之数与位2
    MVCC 底层实现原理
    nginx中sent_timeout属性使用注意事项
    机器学习库Scikit-Learn
    About Critical Values
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/133976760