反射本质是通过Class对象探查并操作类的元数据,入口为Class,经setAccessible(true)可访问私有成员;核心API按字段→构造器→方法顺序拆解,高频面试题均源于此操作链。

记Java反射思维导图和面试题,关键不是死背节点,而是抓住“类在运行时如何被看见、被拆解、被操作”这条主线。把反射理解成一次对 Class 对象的“现场探查+动手操作”,记忆就自然有逻辑了。
紧扣 Class 是唯一入口
所有反射操作都从一个 Class 对象开始——它不是普通类,是 JVM 加载类后生成的“元数据镜像”。记牢三种获取方式,各自适用场景很清晰:
- 类名.class:编译期已知类,最安全、最快,适合框架内部硬编码(比如 Spring 的 BeanDefinition)
- 对象.getClass():已有实例,想查它真实类型(注意不是 instanceof,getClass() 不认继承关系)
- Class.forName("全限定名"):配置驱动,比如 JDBC 加载驱动、插件动态加载,字符串可外部化
按“拆解类”的顺序记核心 API
拿到 Class 后,就像打开一个盒子,一层层看里面有什么。顺着字段→构造器→方法这个物理结构记,比零散背 API 更稳:
- 字段(Field):用 getDeclaredField() 拿私有字段,setAccessible(true) 才能读写;get() / set() 操作值;注意 final 字段能改但可能无效(编译期内联)
- 构造器(Constructor):getDeclaredConstructor(类型...) 获取指定参数构造器;newInstance() 前必须 setAccessible(true),尤其对 private 构造器
- 方法(Method):getDeclaredMethod(名字, 类型...);invoke(实例, 参数) 调用;private 方法同样要 setAccessible(true)
把高频面试题嵌入操作流程
很多题本质是考你是否真动过手。把问题还原成具体步骤,记忆带手感:
立即学习“Java免费学习笔记(深入)”;
- “怎么调用私有方法?” → 先 getDeclaredMethod,再 setAccessible(true),最后 invoke
- “Class.forName 和类名.class 区别?” → 前者触发类初始化(执行 static 块),后者不触发
- “反射为什么慢?” → 每次都要做访问检查、类型匹配、安全验证,JVM 无法内联优化
- “Spring 为什么依赖反射?” → IOC 创建 Bean(哪怕 private 构造)、注入 private 字段、AOP 动态代理织入,全靠反射突破封装
用一句话串起整个链条
“通过 Class 对象,我能拿到这个类的所有字段、构造器、方法;只要加上 setAccessible(true),就能绕过访问控制,读写私有字段、调用私有方法、用私有构造创建对象——这就是反射能干的事。”
这句话覆盖了本质、入口、能力、代价,其余细节都是它的展开。每次回忆,先默念这句,再往里填具体 API 和注意事项,就不容易漏掉重点。


















