当前位置: 首页 > news >正文

【Java初学基础10】一文讲清反射

1. 什么是反射

反射(Reflection)是 Java 提供的一种在运行时动态获取类的信息,并能操作类的属性和方法的机制
通过反射,你可以在不知道对象具体类型的情况下,操作它的属性、方法、构造函数等。

使用idea时的自动提示就是依赖了反射机制。

反射的核心是 java.lang.reflect 包。

字节码文件的本质

  • class 文件是 跨平台的中间表示形式,里面存放着:

    • 类的元信息(类名、父类、接口等)

    • 成员变量信息

    • 方法的字节码指令

    • 常量池(字符串常量、方法引用等)

我们可以通过反射获取这些信息。

所以 Java 实现了“一次编译,到处运行”

  • Windows、Linux、Mac 各自有 JVM,能识别同样的 .class 文件并执行。

2. 反射的主要功能

  1. 获取类的字节码信息

    Class<?> clazz = Class.forName("java.util.ArrayList");三种获取方式:Class.forName("全限定类名")类名.class对象.getClass()
    • 获取类的信息

      • 类名:clazz.getName()clazz.getSimpleName()

      • 包名:clazz.getPackage()

    • 获取构造方法

      Constructor<?>[] constructors = clazz.getConstructors(); // 公共构造方法 Constructor<?> constructor = clazz.getDeclaredConstructor(String.class); // 指定构造器
      getConstructors()
      获取 所有 public 构造方法。getDeclaredConstructors()
      获取 所有构造方法(包括 private、protected、default、public)。getConstructor(Class<?>... parameterTypes)
      获取 指定参数类型的 public 构造方法。getDeclaredConstructor(Class<?>... parameterTypes)
      获取 指定参数类型的构造方法(不管访问修饰符)。
    • 获取字段(成员变量)

      Field[] fields = clazz.getDeclaredFields(); // 所有字段 
      Field field = clazz.getDeclaredField("name"); 
      field.setAccessible(true); // 允许访问 
      private field.set(obj, "Tom"); // 给字段赋值

    • 获取方法

      Method[] methods = clazz.getDeclaredMethods(); 
      Method method = clazz.getDeclaredMethod("setName", String.class);method.invoke(obj, "Tom"); // 调用方法

    • 操作对象

      Object obj = clazz.getDeclaredConstructor().newInstance(); // 创建对象

    总结:


    • public 构造方法:用 getConstructors()getConstructor(...)

    • 所有构造方法(包括 private):用 getDeclaredConstructors()getDeclaredConstructor(...),并且要 setAccessible(true) 才能使用。(暴力反射,不管是不是private)


    • 获取成员变量

      • getField → public 字段(含继承)

      • getDeclaredField → 本类所有字段(private/protected/public/默认)

    • 操作 private 字段

      • setAccessible(true)

    • 获取/修改值

      • get(obj) / set(obj, value)

    • 反射可以获取字段名、类型、注解信息等,非常灵活,但性能比直接访问慢一些。


    反射的应用场景

    应用方向案例技术体现
    动态类加载插件系统、工厂模式Class.forName() + newInstance()
    动态方法调用MVC 框架、测试工具Method.invoke()
    动态字段访问ORM 框架、JSON 序列化Field.get()/set()
    注解解析Spring、JUnitisAnnotationPresent(), 反射扫描类/方法
    动态代理AOP、RPCProxy.newProxyInstance()
    配置驱动任务调度、自动化脚本结合反射解析配置执行类/方法

    核心结论
    反射的最大价值是 通用性和灵活性,它允许程序在运行时动态处理类、对象和方法,解耦、框架化、插件化、自动化

    http://www.dtcms.com/a/419900.html

    相关文章:

  2. 深圳外贸营销型网站建设网站优化和提升网站排名怎么做
  3. 可以做电算化的网站鄂州网站推广
  4. 驻马店哪家做网站好专业展馆展厅设计
  5. 20250928的学习笔记
  6. seo网站推广策略福州短视频seo程序
  7. Tsinghua OJ 工作分配(Workload)C++ 数组指针实现
  8. 免费网站知乎网页打不开但是qq能上是怎么回事
  9. 宁波网站设计制作公司wordpress免费简约模板
  10. 乐山 做网站WordPress工作发布
  11. 3.6 局域网 (答案见原书 P110)
  12. C++基础:(五)类和对象(下)—— static、友元和内部类
  13. 【二至九位数个位起符合递减限制求和】2022-11-19
  14. eclipse jsp 网站开发登录中国沈阳网站
  15. 【连载1】《假装自己是个小白 —— 重新认识 MySQL》实践指南
  16. 智能客服机器人推动客服岗位角色转型
  17. 商丘建设网站网站图片怎么做白色背景
  18. 网站优化如何提高排名根据百度地图做网站
  19. VC++ 使用OpenSSL创建RSA密钥PEM文件
  20. 测试覆盖率:从度量到优化的完整工程实践指南
  21. 贵阳网站设计哪家好无锡手机网站开发
  22. SpringBoot中StringUtils工具类的使用
  23. 阿里云网站方案建设书模板wordpress评论编辑器
  24. SpringBoot核心注解、自动配置原理和配置文件
  25. 46.NAT、代理服务、内网穿透
  26. 网站平台建设规划西安最好的设计院排名
  27. 基于Spring Boot与SSM的中药实验管理系统架构设计
  28. 【Spring】Spring Boot 自动配置原理分析
  29. git 的常用命令
  30. 现在ui做的比较好的网站免费云手机无限时间版
  31. 整体设计 逻辑系统程序 之2 Target 之1 靶点根治的逻辑体系深化与落地设计:从规则双轨到语言 - 知识桥梁