java反射是在运行时动态获取类信息并操作成员的能力,核心作用是打破封装实现动态调用,广泛应用于spring、mybatis等框架的bean创建、依赖注入与orm映射中。

Java 反射是面试高频考点,重点不在背API,而在理解“为什么需要反射”和“它用在哪儿”。写面试题时,要分层递进:从基础用法 → 常见陷阱 → 实际场景 → 安全与性能权衡。下面给你一套可直接用于面试准备或技术分享的演练题设计思路,覆盖真实考察维度。
一、基础能力:能用反射获取并调用类成员
这是入门门槛,考的是对 Class、Field、Method、Constructor 等核心类的熟悉度。题目要避免纯记忆,强调“动手推演”:
- 给定一个私有字段 private String name = "Alice" 的 Person 类,写出通过反射读取该字段值的完整代码(含异常处理)
- 如果该字段被 final 修饰,还能通过反射修改吗?为什么?(引出 Unsafe 和 JDK 9+ 模块限制)
- 调用一个带 int 和 String 参数的私有方法,如何传参?注意基本类型与包装类的匹配规则
二、原理理解:Class 对象怎么来的?谁加载的?
很多候选人会用但说不清 Class 对象的本质。这里可挖深一层:
- Person.class、Class.forName("com.example.Person")、obj.getClass() 三者获取的 Class 对象是否相等?为什么?(涉及类加载器双亲委派和实例归属)
- 同一个类,被两个不同 ClassLoader 加载,会产生几个 Class 对象?它们能互相转型吗?(引出类型系统隔离)
- 为什么静态内部类不会触发外部类初始化?而反射 Class.forName("Outer$Inner") 会吗?
三、实战判断:哪些框架/场景真用了反射?怎么用的?
脱离场景谈反射就是纸上谈兵。面试官爱问“你项目里用过吗”,其实是想听你懂落地逻辑:
- Spring 是怎么用反射创建 Bean 实例的?构造器选择策略(默认 vs 有参)依赖什么?
- MyBatis 的 @Select 注解方法返回 List
,它是如何把 ResultSet 映射成泛型对象的?(结合 TypeToken + 反射获取泛型实际类型) - Lombok 的 @Data 编译期生成 getter/setter,和运行时反射获取字段有什么本质区别?
四、避坑意识:反射不是万能钥匙
高级考察点——能否理性评估反射代价。这体现工程素养:
- 频繁调用 setAccessible(true) 会带来什么风险?JDK 12+ 对非法反射访问做了哪些限制?
- 为什么 Spring Boot 2.6+ 默认禁用 CGLIB 代理(改用基于接口的 JDK Proxy)?和反射性能有何关联?
- 用反射实现通用 JSON 序列化时,如何避免因字段名大小写、忽略 static/final 字段等导致的序列化错误?(提示:需结合 Annotation + getDeclaredFields() 过滤)
不复杂但容易忽略:真正拉开差距的,不是你会不会写 clazz.getDeclaredMethod("xxx").invoke(obj),而是你能讲清“这一行背后 JVM 做了什么”“线上出问题怎么定位”“有没有更安全的替代方案”。把反射当成一把“开锁工具”,而不是“万能钥匙”,面试就稳了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











