反射本质是运行时动态操作类,核心入口为class对象;须掌握三种获取方式(类名.class、对象.getclass()、class.forname)、构造器创建对象、方法/字段调用与访问,结合配置文件实战巩固。

直接学核心路径,不绕弯:先理解“运行时动态操作类”这个本质,再动手练三类典型操作(获取 Class、创建对象、调用方法/字段),最后结合配置文件和框架场景巩固。面试和实际开发中真正高频考的,就这三块。
抓住反射的唯一入口:Class 对象怎么拿
所有反射操作都从 Class 对象开始,它就是类在内存里的“完整说明书”。必须熟练掌握三种获取方式,各自适用场景不同:
-
类名.class:编译期已知类型,最安全,无异常,适合工具类或泛型边界(如
List.class) - 对象.getClass():已有实例时用,注意返回的是实际运行时类型(可能和声明类型不同)
-
Class.forName("全限定名"):框架最爱,类名来自配置文件、数据库或用户输入;必须捕获
ClassNotFoundException,且会触发类的初始化(静态代码块执行)
验证三者拿到的是同一个对象——这是理解 JVM 类加载机制的关键点。
动手创建对象:不只是 new,还要处理构造器
反射创建对象不是简单调 newInstance()(已废弃),而是走标准流程:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 用
getDeclaredConstructor(参数类型...)获取指定构造器(含 private) - 调
setAccessible(true)绕过访问控制(仅限测试或框架内部,生产慎用) - 再用
constructor.newInstance(实参...)实例化
注意:无参构造器可用 getDeclaredConstructor();带参构造器必须严格匹配参数类型(int.class 不等于 Integer.class)。
调方法、读写字段:重点在“Declared”和“Accessible”
反射能突破 private 限制,但需主动“开锁”:
-
getMethod("name", 参数类型...)只查 public 方法(含父类继承的) -
getDeclaredMethod("name", 参数类型...)查本类所有方法(含 private),但不包括继承的 - 对 private 方法/字段,必须先调
setAccessible(true),否则运行时报IllegalAccessException - 调用时注意:实例方法需传入目标对象;静态方法传
null;返回值要按实际类型强转
连起来练一个真实小场景:读配置文件 + 反射执行
这是 Spring 和 MyBatis 的简化雏形,也是面试最爱问的综合题:
- 写个
config.properties:存类全名、方法名、参数值 - 用
Properties.load()加载,取字符串 - 用
Class.forName()加载类 - 反射创建实例 → 获取方法 → 设置参数 → 执行并打印结果
过程中自然覆盖 Class 获取、构造器、方法调用、异常处理——一次练透,比零散背 API 强十倍。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










