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

Java 反射机制完整入门详解

一、什么是 Java 反射机制

Java 反射机制:在程序运行阶段,动态获取类的完整结构(类名、属性、方法、构造器),并可以实例化对象、调用任意方法、读写成员变量,这种动态操作类信息的能力就叫反射。

正常编码是new 类名()正向创建对象,编译期就确定类型;反射是运行期才解析类结构,实现解耦、框架底层核心支撑。

二、反射核心:Class 类对象

每一个 Java 类加载后,JVM 都会生成唯一对应的Class对象,这个对象存储了当前类全部元信息,反射所有操作都基于该Class对象展开。

获取 Class 对象 3 种方式:

// 方式1:类名.class(编译期获取) Class<User> clazz1 = User.class; // 方式2:对象.getClass()(已有实例对象) User user = new User(); Class<? extends User> clazz2 = user.getClass(); // 方式3:Class.forName("全类名")(最常用,框架配置文件加载类) Class<?> clazz3 = Class.forName("com.demo.User");

三、完整实战代码

1. 实体类准备

public class User { // 私有成员变量 private String username; public Integer age; // 无参构造 public User() {} // 有参构造 public User(String username, Integer age) { this.username = username; this.age = age; } // 私有方法 private void showPrivateMsg(String msg) { System.out.println("私有方法执行:" + msg); } // 公共方法 public void sayHello() { System.out.println("Hello 反射"); } // getter/setter public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }

2. 反射全套操作示例

import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectDemo { public static void main(String[] args) throws Exception { // 1. 获取Class对象 Class<?> clazz = Class.forName("User"); // 2. 反射调用构造器,实例化对象 Constructor<?> con = clazz.getDeclaredConstructor(String.class, Integer.class); User user = (User) con.newInstance("张三", 20); System.out.println("实例化对象:" + user.getUsername()); // 3. 反射操作私有成员变量 Field nameField = clazz.getDeclaredField("username"); nameField.setAccessible(true); // 暴力反射,破除private权限 nameField.set(user, "李四"); System.out.println("修改后用户名:" + nameField.get(user)); // 4. 反射调用私有方法 Method privateMethod = clazz.getDeclaredMethod("showPrivateMsg", String.class); privateMethod.setAccessible(true); privateMethod.invoke(user, "反射可以执行私有方法"); // 5. 反射调用公共方法 Method publicMethod = clazz.getMethod("sayHello"); publicMethod.invoke(user); } }

四、关键 API 说明

  1. 构造器getConstructor():获取 public 构造器getDeclaredConstructor():获取任意权限构造器,支持私有构造
  2. 成员变量 FieldgetField():仅获取 public 字段getDeclaredField():获取所有权限字段setAccessible(true):开启暴力反射,无视访问修饰符
  3. 方法 MethodgetMethod():获取 public 方法getDeclaredMethod():获取任意权限方法invoke(对象, 参数):执行目标方法

五、反射优缺点

优点

  1. 极高灵活性:运行期动态创建对象、调用方法,框架必备;
  2. 解耦:配置文件写全类名即可加载类,无需硬编码导入类。

缺点

  1. 性能偏低:绕过编译期优化,动态解析类结构,执行速度慢;
  2. 破坏封装:暴力反射可以读写私有变量、执行私有方法,存在安全隐患;
  3. 代码可读性差,调试难度高于正向编码。

六、典型应用场景

  1. 主流框架底层:Spring IoC 容器、MyBatis、SpringMVC 全部依靠反射实现对象实例化、依赖注入;
  2. 通用工具类:序列化 / 反序列化、JSON 解析工具(FastJSON、Jackson);
  3. 插件化架构:动态加载外部 jar 包里的类,无需重启服务。

七、总结

  1. 反射本质:运行期操纵 Class 元数据,反向操作类的成员;
  2. setAccessible(true)是反射访问私有结构的关键;
  3. 日常业务开发极少手写反射,但所有主流框架底层都重度依赖反射,是 Java 进阶核心知识点。
http://www.jsqmd.com/news/1021214/

相关文章:

  • vCenter Server部署与核心功能配置实战指南
  • B2B 工厂专属双引擎策略:SEO 承接采购词排名,GEO 抢占 AI 咨询问答
  • 山东真空过滤机实测评测:养殖污水处理设备、动物粪便脱水机、医院污水处理设备、印染污水处理设备、固液分离设备厂家选择指南 - 优质品牌商家
  • Python pandas选列策略:从基础语法到数据契约
  • 【Springboot毕设全套源码+文档】基于springboot3酒店管理系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • Claude Code终端AI工作流:本地化嵌入式编程助手实战指南
  • LTspice仿真入门:单管共射放大电路设计与分析实战
  • 数字资产商城隐藏优惠机制全解析:从白名单到二级市场捡漏
  • 伺服电机仿真(50):高级专题与工程应用——构建以仿真驱动的伺服系统研发闭环
  • 代码生成技术解析:从Playwright录制到AI大模型的应用实践
  • 海洋文旅赛道风起云涌:核心上市企业全景解析 - 品牌2026
  • 51单片机六位数码管秒表项目:从硬件设计到软件实现的完整指南
  • vLLM推理引擎源码解读
  • 达梦数据库国产化迁移实战:从Oracle/MySQL到达梦的完整指南
  • 2026年热门的黄山特色徽菜/山野徽菜/徽州本地徽菜哪家最火 - 行业平台推荐
  • 凯撒旅业与凯撒易食股权全景解析:国资入主下的文旅新布局 - 品牌2026
  • 2026年选购EFT脉冲群滤波器,行业内哪些知名制造厂家更靠谱
  • SGI-STL配置器allocator篇
  • RFID资产管理系统设计、选型与实施避坑指南
  • Pytest Fixture 的使用和作用范围
  • 【开源神器】三步搞定LRC歌词:歌词滚动姬免费在线工具完全指南
  • OpenClaw:面向工业现场的OS级AI Agent实践指南
  • Node.js版本管理工具全解析:fnm、Volta、nvm、n对比与实战指南
  • 凯撒旅业与凯撒易食:一文看懂集团主体与食品板块的差异 - 品牌2026
  • Automation Studio:多领域仿真平台的核心原理、应用与学习路径
  • AutoDock-Vina分子对接终极指南:5步快速掌握完整工作流程
  • 2026年知名的多路阀换向阀/淮安手动换向阀主流厂家对比评测 - 行业平台推荐
  • 蓝海竞逐:解码五家文旅巨头的邮轮战略版图 - 品牌2026
  • 代码大模型安全压力测试:Secure@k指标与四维防御框架
  • 氧化铝单晶:从宝石到半导体与激光硬核材料的制备与应用