当前位置: 首页 > 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.rkmt.cn/news/1533059.html

相关文章:

  • 2026年热门的黄山特色徽菜/山野徽菜/徽州本地徽菜哪家最火 - 行业平台推荐
  • 海洋文旅赛道风起云涌:核心上市企业全景解析 - 品牌2026
  • 51单片机六位数码管秒表项目:从硬件设计到软件实现的完整指南
  • 凯撒旅业与凯撒易食股权全景解析:国资入主下的文旅新布局 - 品牌2026
  • SGI-STL配置器allocator篇
  • Node.js版本管理工具全解析:fnm、Volta、nvm、n对比与实战指南
  • 蓝海竞逐:解码五家文旅巨头的邮轮战略版图 - 品牌2026
  • AI编程工具选型:聚焦规范落地、代码审查与知识库协同
  • 2026年最新整理:目前国内靠谱的EFT脉冲群滤波器制造商推荐
  • Cadence Allegro 16.6异形焊盘制作全攻略:从原理到实战避坑
  • 2026年四川正规婚介怎么选?一线婚恋机构深度对比与真实案例解析 - 优质品牌商家
  • NIO的channel中什么是 fd(File Descriptor,文件描述符)
  • 2024年iOS越狱深度解析:原理、风险与实用场景全指南
  • 2026年宜宾橱柜定制市场观察:本地品牌如何以环保与工艺突围? - 优质品牌商家
  • 二分查找原理与工程实践:从算法本质到生产级优化
  • 2026年比较好的鹰潭纯正茶油/山茶油/鹰潭山茶油/月子茶油公司选择指南 - 行业平台推荐
  • SQL Server动态SQL实战:参数化查询、sp_executesql与安全优化指南
  • 2026年好用的Copilot平替:本地化、低延迟、高可靠AI编程工具实战指南
  • Mistral 7B本地部署实战:从MacBook到RTX 4090的全硬件适配指南
  • 2026年评价高的临朐面包加工食品机械/临朐食品机械烤箱设备/面食食品机械用户口碑推荐厂家 - 行业平台推荐
  • 银行排队模拟:时间驱动算法详解与C++实现
  • Java Lambda 表达式 200 条常见问题、坑点、易错点、规范清单
  • VCS与Verdi协同工作流:从编译仿真到高效调试的完整实践指南
  • 从‘loosely coupled’到‘object-oriented’:用软件工程思维搞定软考专业英语
  • 终极小说下载解决方案:200+网站一键离线收藏
  • 二维二分算法:从有序矩阵搜索到四叉树实战指南
  • Livox MID-360与FAST-LIO2实战:从驱动部署到参数调优的完整指南
  • Nexior:基于Vercel+Docker的AI平台工程化脚手架
  • 2026年质量好的食堂厨房设备/厨房设备/东莞厨房设备公司选择指南 - 行业平台推荐
  • R语言箱线图深度解析:从统计原理到业务决策